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

标签 perl bash shell awk

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

文件 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

谢谢

最佳答案

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

而且您不必使用排序 实用程序。 @ind_num_asc 是索引数字升序。参见 Controlling Array Traversal and Array SortingUsing Predefined Array Scanning Orders with gawk .

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

关于perl - 根据第一列将两个文件合并为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4072180/

相关文章:

perl - Moo 对象扩展顺序

perl - AnyEvent fork_call 和 ping

mysql - 如何忽略bash脚本中的转义字符?

regex - sed 命令在 solaris 中有效,但在 Linux 中无效

windows - 检测到文件夹中正在复制文件

perl - 使用 sed 或 perl 替换两个字符之间的多个字符

linux - 在 ubuntu 中编辑 bashrc 文件后命令不起作用

bash - 在 Docker 容器启动时启动 bash 脚本不起作用

javascript - 使用node child_process.exec执行top命令时如何解决错误?

linux - 如何删除位置参数的扩展名?