在paste 之后使用这个 Perl 单行来打印交替列:
paste file_A file_B | perl -F'\t' -lane 'print join "\t", @F[ map { ( $_, $_ + ( @F/2 ) ) } 0 .. ( $#F - 1 ) / 2 ];'
例子:
创建制表符分隔的输入文件:
perl -le 'print join "\t", 1..5 for 1..2;' > file_A
perl -le 'print join "\t", "A".."E" for 1..2;' > file_B
head file_A file_B
打印:
==> file_A <==
1 2 3 4 5
1 2 3 4 5
==> file_B <==
A B C D E
A B C D E
并排粘贴文件,也用制表符分隔:
paste file_A file_B | perl -F'\t' -lane 'print join "\t", @F[ map { ( $_, $_ + ( @F/2 ) ) } 0 .. ( $#F - 1 ) / 2 ];'
打印:
1 A 2 B 3 C 4 D 5 E
1 A 2 B 3 C 4 D 5 E
Perl 单行程序使用这些命令行标志:
-e:告诉 Perl 查找内联代码,而不是在文件中。
-n:循环输入一行一次,默认将其分配给$_。
-l:在执行内联代码之前剥离输入行分隔符(默认为 *NIX 上的"\n"),并在打印时附加它。-a :在空格或-F 选项中指定的正则表达式上将$_ 拆分为数组@F。
-F'/\t/' :在TAB 上拆分为@F,而不是在空白上。
$#F:数组 @F 的最后一个索引与输入字段,在选项卡上拆分。
0 .. ( $#F - 1 ) / 2:数组 @F 的 索引 数组,来自start (0) 到数组的一半。这些都是与file_A对应的索引。
map { ( $_, $_ + ( @F/2 ) ) } 0 .. ( $#F - 1 ) / 2:map将上述索引数组从0到@F长度的一半,并返回一个新数组,其数量是两倍元素。它的元素交替出现:(a) 对应于 file_A 的索引 ($_) 和 (b) 该索引加上数组长度的一半 ($_ + ( @F/2 )),这是来自 file_B 的对应索引。
@F[ map { ( $_, $_ + ( @F/2 ) ) } 0 .. ( $#F - 1 ) / 2 ] :具有指定索引的数组@F 的切片,即来自file_A 和file_B 的交替字段。
另请参阅:
perldoc perlrun: how to execute the Perl interpreter: command line switches
perldoc perldata: Slices