根据第一列将两个文件合并为一个文件

veh*_*zzz 3 bash shell perl awk

我有两个文件,都是相同的格式 - 两列都包含一个数字,例如:

档案1

1.00    99
2.00    343
3.00    34
...
10.00   343
Run Code Online (Sandbox Code Playgroud)

档案2

1.00    0.4
2.00    0.5
3.00    0.34
...
10.00   0.9
Run Code Online (Sandbox Code Playgroud)

我想生成以下文件(使用,awk,bash perl):

1.00    99      0.4 
2.00    343     0.5      
3.00    34      0.34
...
10.00   343     0.9
Run Code Online (Sandbox Code Playgroud)

谢谢

Pau*_*ce. 7

join file1 file2
Run Code Online (Sandbox Code Playgroud)

假设文件在连接字段中排序.如果不是,您可以这样做:

join <(sort -V file1) <(sort -V file2)
Run Code Online (Sandbox Code Playgroud)

这是一个AWK版本(sort补偿AWK的非确定性数组排序):

awk '{a[$1]=a[$1] FS $2} END {for (i in a) print i a[i]}' file1 file2 | sort -V
Run Code Online (Sandbox Code Playgroud)

它似乎比Perl答案更短,更易读.

gawk4中,您可以设置数组遍历顺序:

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
Run Code Online (Sandbox Code Playgroud)

而且您不必使用该sort实用程序.@ind_num_asc是Index Numeric Ascending.请参阅使用gawk 控制阵列遍历和阵列排序以及使用预定义阵列扫描顺序.

请注意,上述命令中的-V(--version-sort)sort需要sort来自coreutils 7.0或更高版本的GNU .感谢@simlev指出如果可用的话应该使用它.

  • @Jim:join由POSIX指定,[很久以前就存在](http://www.freebsd.org/cgi/man.cgi?query=join&apropos=0&sektion=0&manpath=Unix+Seventh+Edition&format=html). (2认同)