Home > Software design >  How to echo each two lines in one line [duplicate]
How to echo each two lines in one line [duplicate]

Time:09-16

I have one txt file with below content:

20210910 ABC  ZZZ            EEE  Rcvd     Staging QV QV P
20210813_20210816_20210818
20210910 XYZ  YYY            EEE  Rcvd     Staging QV QV R
20210813_20210816

There are four rows. How to echo those in two rows. I am not getting how to write if statement in the below code. If the logic is correct please advice :

cat file.txt | while read n
do
    if [ row number odd ]
    then
        column1=`echo $n | awk 'NF' | awk '{print $1}'`
        column2=`echo $n | awk 'NF'| awk '{print $2}'`
        ...till column9
    else
        column10=`echo $n | awk 'NF'| awk '{print $1}'`

        [Printing all columns : 

echo " $column1 " >> ${tmpfn}

echo " $column2 " >> ${tmpfn}

        ...till column10]

    fi
done 

Output:

20210910 ABC  ZZZ            EEE  Rcvd     Staging QV QV P 20210813_20210816_20210818
20210910 XYZ  YYY            EEE  Rcvd     Staging QV QV R 20210813_20210816

CodePudding user response:

You can do this with a single awk script:

awk '{x=$0; getline y; print x, y}' file.txt

CodePudding user response:

No need for an if statement. Just call read twice each time through the loop.

while read -r line1 && read -r line2
do
    printf "%s %s" "$line1" "$line2"
done < file.txt > "${tmpfn}"

CodePudding user response:

Use this Perl one-liner (it joins each pair of lines on the tab character):

perl -lne 'chomp( $s = <> ); print join "\t", $_, $s;' file.txt > out_file.txt

For example:

seq 1 4 | perl -lne 'chomp( $s = <> ); print join "\t", $_, $s;'
1       2
3       4

The Perl one-liner uses these command line flags:
-e : Tells Perl to look for code in-line, instead of in a file.
-n : Loop over the input one line at a time, assigning it to $_ by default.
-l : Strip the input line separator ("\n" on *NIX by default) before executing the code in-line, and append it when printing.

Here,
-n and -l command line switches cause the script to read 1 line from STDIN or from file(s) on the command line (in a loop), and store it in variable $_, removing the terminal newline.
chomp( $s = <> ); : Do the same as above, and store it in variable $s.
Now you have, for example, line 1 stored in $_ and line 2 stored in $s.
print join "\t", $_, $s; : print the two lines delimited by tab.
Repeat the above.

SEE ALSO:
perldoc perlrun: how to execute the Perl interpreter: command line switches

  • Related