如何在一行中回显每两行
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
我有一个 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