【问题标题】:unix: merge 2 files using 2nd columnsunix:使用第二列合并 2 个文件
【发布时间】:2011-02-11 16:53:26
【问题描述】:

我想根据第 2 列的内容合并两个文件。

文件 1:

"4742"  "209220_at"     2.60700394801826
"104"   "209396_s_at"   2.60651442103297
"749"   "202409_at"     2.59424724783704
"4168"  "209875_s_at"   2.58773204877464
"3973"  "1431_at"       2.52832098784342
"1826"  "207201_s_at"   2.41685345240968

文件2:

"653"   "1431_at"       2.14595534191867
"1109"  "207201_s_at"   2.13777517447307
"353"   "212531_at"     2.12706340284672
"381"   "206535_at"     2.11456707231618
"1846"  "204534_at"     2.10919474441178

到底有:

"3973"  "1431_at"       2.52832098784342 "653"   "1431_at"       2.14595534191867
"1826"  "207201_s_at"   2.41685345240968 "1109"  "207201_s_at"   2.13777517447307

我试过commdiff,一些不起眼的awk单行,但没有任何成功。 非常感谢任何帮助。 本

【问题讨论】:

    标签: unix merge awk


    【解决方案1】:

    您可以结合使用sortjoin 命令来完成此操作。直接的方法是

    join -j2 <(sort -k2 file1) <(sort -k2 file2)
    

    但这显示与您正在寻找的略有不同。它只显示公共连接字段,然后显示每个文件中的剩余字段

    "1431_at" "3973" 2.52832098784342 "653" 2.14595534191867
    "207201_s_at" "1826" 2.41685345240968 "1109" 2.13777517447307
    

    如果您需要完全按照您显示的格式,那么您需要告诉join 以这种方式输出

    join -o 1.1,1.2,1.3,2.1,2.2,2.3 -j2 <(sort -k2 file1) <(sort -k2 file2)
    

    其中-o 接受FILENUM.FIELDNUM 说明符列表。

    请注意,我使用的&lt;() 语法不是 POSIX sh,因此如果您需要 POSIX sh 语法,您应该排序到一个临时文件。

    【讨论】:

    • 如果你使用某些版本的bash,你也可以写:join -j2 &lt;(sort -k2 file{1,2})
    • 除了不提供带有两组不同输入的连接。
    【解决方案2】:
    awk '
      # store the first file, indexed by col2
      NR==FNR {f1[$2] = $0; next}
      # output only if file1 contains file2's col2
      ($2 in f1) {print f1[$2], $0}
    ' file1 file2
    

    【讨论】:

    • 请注意,这会将整个 file1 存储在内存中,因此您可能希望将较小的文件作为 file1
    【解决方案3】:

    如果文件很小,请使用脚本语言(Perl、Python 和 Ruby 都是不错的选择)编写程序,将第一个文件读入以第二列为键的散列,然后通读第二个文件并使用散列查找以找出可以加入的内容(如果有的话)。

    如果文件很大,则为每个文件交换第一列和第二列,将它们传递给 unix 排序实用程序,然后在脚本语言中合并(加上列重新排序)两个排序的文件。

    【讨论】:

      【解决方案4】:
      awk 'FNR==NR{a[$2]=$0} NR>FNR && ($2 in a){ print $0,a[$2] } ' file2 file1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-14
        • 1970-01-01
        • 2021-01-08
        • 2012-12-01
        • 2014-07-11
        • 2013-08-01
        • 1970-01-01
        • 2017-01-21
        相关资源
        最近更新 更多