代码之家  ›  专栏  ›  技术社区  ›  vehomzzz

基于第一列将两个文件合并为一个文件

  •  3
  • vehomzzz  · 技术社区  · 15 年前

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

    文件1

    1.00    99
    2.00    343
    3.00    34
    ...
    10.00   343
    

    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 回复  |  直到 15 年前
        1
  •  7
  •   Dennis Williamson    8 年前
    join file1 file2
    

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

    join <(sort -V file1) <(sort -V file2)
    

    这是一个AWK版本 sort

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

    它似乎比Perl答案更短,可读性更强。

    gawk

    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 Sorting Using Predefined Array Scanning Orders with gawk .

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

        2
  •  2
  •   sid_com    10 年前

    Perl解决方案

    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
    

    perl -anE '$h{$F[0]}="$h{$F[0]}\t$F[1]"; END{say "$_$h{$_}" for sort {$a<=>$b} keys %h}' file_1 file_2
    

    如果在第一个文件的第二列中有没有值的条目,则一行程序的行为与联接示例不同。

        3
  •  0
  •   agershun    11 年前

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

    Node.js 然后 Alasql 包裹:

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

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