Putting Two Consecutive Lines into One Line with Perl / AWK
$ sed 'N;s/\n/ /' input.txt
abcd join abcd
efgh join efgh
Merge every two consecutive lines
On the first line, save its value, and then for each subsequent line, print the previous saved value and the current text, and then replace the saved text with the current line:
$ awk 'NR == 1 { prev = $0; next }
{ print prev, $0; prev = $0 }' input.txt
Reservoir Dogs
Dogs 1992
1992 reviewed
reviewed by
by Michael
Michael Hareven
Joining two consecutive lines using awk or sed
awk '!(NR%2){print$0p}{p=$0}' infile
How to merge every two lines into one from the command line?
awk:
awk 'NR%2{printf "%s ",$0;next;}1' yourFile
note, there is an empty line at the end of output.
sed:
sed 'N;s/\n/ /' yourFile
How to print lines between two patterns, inclusive or exclusive (in sed, AWK or Perl)?
Print lines between PAT1 and PAT2
$ awk '/PAT1/,/PAT2/' file
PAT1
3 - first block
4
PAT2
PAT1
7 - second block
PAT2
PAT1
10 - third block
Or, using variables:
awk '/PAT1/{flag=1} flag; /PAT2/{flag=0}' file
How does this work?
/PAT1/
matches lines having this text, as well as/PAT2/
does./PAT1/{flag=1}
sets theflag
when the textPAT1
is found in a line./PAT2/{flag=0}
unsets theflag
when the textPAT2
is found in a line.flag
is a pattern with the default action, which is toprint $0
: ifflag
is equal 1 the line is printed. This way, it will print all those lines occurring from the timePAT1
occurs and up to the nextPAT2
is seen. This will also print the lines from the last match ofPAT1
up to the end of the file.
Print lines between PAT1 and PAT2 - not including PAT1 and PAT2
$ awk '/PAT1/{flag=1; next} /PAT2/{flag=0} flag' file
3 - first block
4
7 - second block
10 - third block
This uses next
to skip the line that contains PAT1
in order to avoid this being printed.
This call to next
can be dropped by reshuffling the blocks: awk '/PAT2/{flag=0} flag; /PAT1/{flag=1}' file
.
Print lines between PAT1 and PAT2 - including PAT1
$ awk '/PAT1/{flag=1} /PAT2/{flag=0} flag' file
PAT1
3 - first block
4
PAT1
7 - second block
PAT1
10 - third block
By placing flag
at the very end, it triggers the action that was set on either PAT1 or PAT2: to print on PAT1, not to print on PAT2.
Print lines between PAT1 and PAT2 - including PAT2
$ awk 'flag; /PAT1/{flag=1} /PAT2/{flag=0}' file
3 - first block
4
PAT2
7 - second block
PAT2
10 - third block
By placing flag
at the very beginning, it triggers the action that was set previously and hence print the closing pattern but not the starting one.
Print lines between PAT1 and PAT2 - excluding lines from the last PAT1 to the end of file if no other PAT2 occurs
This is based on a solution by Ed Morton.
awk 'flag{
if (/PAT2/)
{printf "%s", buf; flag=0; buf=""}
else
buf = buf $0 ORS
}
/PAT1/ {flag=1}' file
As a one-liner:
$ awk 'flag{ if (/PAT2/){printf "%s", buf; flag=0; buf=""} else buf = buf $0 ORS}; /PAT1/{flag=1}' file
3 - first block
4
7 - second block
# note the lack of third block, since no other PAT2 happens after it
This keeps all the selected lines in a buffer that gets populated from the moment PAT1 is found. Then, it keeps being filled with the following lines until PAT2 is found. In that point, it prints the stored content and empties the buffer.
How to select lines between two marker patterns which may occur multiple times with awk/sed
Use awk
with a flag to trigger the print when necessary:
$ awk '/abc/{flag=1;next}/mno/{flag=0}flag' file
def1
ghi1
jkl1
def2
ghi2
jkl2
How does this work?
/abc/
matches lines having this text, as well as/mno/
does./abc/{flag=1;next}
sets theflag
when the textabc
is found. Then, it skips the line./mno/{flag=0}
unsets theflag
when the textmno
is found.- The final
flag
is a pattern with the default action, which is toprint $0
: ifflag
is equal 1 the line is printed.
For a more detailed description and examples, together with cases when the patterns are either shown or not, see How to select lines between two patterns?.
Related Topics
Install.Packages("Devtools") on R 3.0.2 Fails in Ubuntu 14.04
Change System Date Time in Docker Containers Without Impacting Host
Unsupported Protocol While Download Tar.Gz Package
Git - Windows and Linux Line-Endings
Searching Multiple Patterns (Words) with Ack
Git Bash Is Displaying Strange Characters on Windows 7
For Loop for Files in Multiple Folders - Bash Shell
Why No Zero-Copy Networking in Linux Kernel
How to Release Hugepages from the Crashed Application
Run Silverlight with Apache Server (Under Linux)
How to Sort with Multiple Lines in Bash
How to Set a Ulimit from Inside a Perl Script That Applies to Its Children
How to Tie a Network Connection to a Pid Without Using Lsof or Netstat
Creating a Self-Extracting Zip Archive on a Linux Box