我有两个文件,两个文件格式相同 - 两列都包含一个数字,例如:
档案1
1.00 99
2.00 343
3.00 34
...
10.00 343
文件2
1.00 0.4
2.00 0.5
3.00 0.34
...
10.00 0.9
我希望生成以下文件(使用,awk,bash perl):
1.00 99 0.4
2.00 343 0.5
3.00 34 0.34
...
10.00 343 0.9
感谢
答案 0 :(得分:7)
join file1 file2
假设文件在连接字段中排序。如果不是,你可以这样做:
join <(sort -V file1) <(sort -V file2)
这是一个AWK版本(sort
补偿了AWK的非确定性数组排序):
awk '{a[$1]=a[$1] FS $2} END {for (i in a) print i a[i]}' file1 file2 | sort -V
它似乎比Perl答案更短,更易读。
在gawk
4中,您可以设置数组遍历顺序:
awk 'BEGIN {PROCINFO["sorted_in"] = "@ind_num_asc"} {a[$1]=a[$1] FS $2} END {for (i in a) print i a[i]}' file1 file2
您不必使用sort
实用程序。 @ind_num_asc
是索引数字升序。请参阅Controlling Array Traversal and Array Sorting和Using Predefined Array Scanning Orders with gawk。
请注意,上述-V
命令中的--version-sort
(sort
)需要来自coreutils 7.0或更高版本的GNU sort
。感谢@simlev指出应该使用它。
答案 1 :(得分:2)
Perl-solution
perl -anE 'push @{$h{$F[0]}}, $F[1]; END{ say "$_\t$h{$_}->[0]\t$h{$_}->[1]" for sort{$a<=>$b} keys %h }' file_1 file_2 > file_3
好的,看看awk-oneliner这比我的第一次尝试要短,它有更好的输出然后是awk-oneliner而且它没有使用'pipe sort -n':
perl -anE '$h{$F[0]}="$h{$F[0]}\t$F[1]"; END{say "$_$h{$_}" for sort {$a<=>$b} keys %h}' file_1 file_2
如果第一个文件的第二列中没有值的条目,则单行代码与join-example的行为不同。
答案 2 :(得分:0)