如何在一行中回显每两行

How to echo each two lines in one line

我有一个 txt 文件,内容如下:

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

有四行。如何回显两行中的那些。我不知道如何在下面的代码中编写 if 语句。如果逻辑正确请指教:

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

        [Printing all columns : 

回显“$column1”>> ${tmpfn}

回显“$column2”>> ${tmpfn}

        ...till column10]

    fi
done 

输出:

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

您可以使用单个 awk 脚本完成此操作:

awk '{x=[=10=]; getline y; print x, y}' file.txt

不需要 if 声明。每次循环调用 read 两次即可。

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

使用这个 Perl 单行代码(它在制表符上连接每对行):

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

例如:

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

Perl 单行代码使用这些命令行标志:
-e : 告诉 Perl 查找内联代码,而不是在文件中。
-n :一次循环输入一行,默认分配给 $_
-l : 在执行内联代码之前去除输入行分隔符(默认情况下在 *NIX 上为 "\n"),并在打印时附加它。

这里,
-n-l 命令行开关导致脚本从 STDIN 或命令行上的文件(在循环中)读取 1 行,并将其存储在变量 $_ 中,删除终端换行符。
chomp( $s = <> ); : 同上,存入变量$s.
现在,例如,第 1 行存储在 $_ 中,第 2 行存储在 $s.
print join "\t", $_, $s; : 打印由制表符分隔的两行。
重复以上。

另请参见:
perldoc perlrun: how to execute the Perl interpreter: command line switches