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

时间:2010-11-01 19:02:07

标签: 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

感谢

3 个答案:

答案 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 SortingUsing Predefined Array Scanning Orders with gawk

请注意,上述-V命令中的--version-sortsort)需要来自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)

您可以使用Alacon - Alasql数据库的命令行实用程序。

它适用于Node.js,因此您需要安装Node.js然后Alasql包:

要从制表符分隔的文件中连接两个数据,您可以使用以下命令:

> node alacon "SELECT * INTO TSV("main.txt") FROM TSV('data1.txt') data1 
                   JOIN TSV('data2.txt') data2 USING [0]"

这是一条很长的路线。在此示例中,所有文件都包含&#34; Sheet1&#34;床单。