【问题标题】:merge/join two tables fast linux command line合并/加入两个表快速linux命令行
【发布时间】:2012-10-29 07:29:50
【问题描述】:

假设我有两个相对较大的制表符分隔文件 file1.txt、file2.txt。

file1.txt
id\tcity\tcar\ttype\tmodel

file2.txt 
id\tname\trating

假设 file1.txt 有 2000 个唯一 ID,因此有 2000 个唯一行,而 file2.txt 只有 1000 个唯一行,因此有 1000 个唯一 ID。有没有办法合并两张表?

案例1.file1.txt中通过id合并,file2.txt中没有id时填写NAs。

案例 2。通过file2.txt中的id合并它们,此时只有file2.txt中的id会与file1.txt和file2.txt中的字段一起打印出来。

注意:合并后的新文件也应该是制表符分隔的文件,并带有头文件。 笔记2。如果没有标题,我也很感激有关如何做到这一点的建议。

谢谢!

【问题讨论】:

  • 定义“合并”的含义
  • stackoverflow.com/questions/5467690/…stackoverflow.com/questions/6393333/… 或“相关”侧边栏中的其他内容可能是相关的
  • @Bohemian by merge 我的意思是加入
  • @DavidZaslavsky 非常感谢,它看起来是一个很好的解决方案,但 join 需要对文件进行排序,并且 awk 在没有数据时不会添加 NA。您知道一些可以添加 NA 并保留标签的解决方案吗?

标签: linux unix join merge awk


【解决方案1】:
join -j 1 <(sort file1.txt) <(sort file2.txt)

您的“案例 2”方法是否仅使用标准 unix 工具。当然,如果文件已排序,则可以放弃排序。

如果您包含了标题,您可能依靠数字 ID 将连接的标题排序到顶部:

join -j 1 <(sort file1.txt) <(sort file2.txt) | sort -n

  • file1.txt

    id  city    car type    model
    1   york    subaru  impreza king
    2   kampala toyota  corolla sissy
    3   luzern  chrysler    gravity falcon
    
  • file2.txt

    id  name    rating
    3   zanzini PG
    2   tara    X
    
  • 输出:

    id  city    car type    model   name    rating
    2   kampala toyota  corolla sissy   tara    X
    3   luzern  chrysler    gravity falcon  zanzini PG
    

PS要保留 TAB 分隔符,请传递 -t 选项:

 join -t'    ' ...

很难在 SO 上显示 ' ' 包含 TAB 字符。用 ^VTAB 键入它(例如在 bash 中)

【讨论】:

    【解决方案2】:

    这在案例 1 中对我有用:

    join -t $'\t' -1 1 -2 1 -a 1 -a 2 &lt;(sort fileone.txt) &lt;(sort filetwo.txt) | sort -n -t $'\t' &gt; filethree.txt

    然后:

    awk '{if(NF+0&lt;7) printf "%s\tNA\tNA\n", $0; else print $0}' filethree.txt

    【讨论】:

      【解决方案3】:

      尝试这样做:

      perl -lane '
          END{print "$_$h{$_}" for sort keys %h}
          $h{$F[0]} .= "\t" .  join "\t", @F[1..$#F];
      ' file1.txt file2.txt
      

      此脚本加入 ids(第一列)。

      【讨论】:

      • 谢谢!它可以工作,但有一些注意事项:(1)如果 id 在 file1.txt 的第 3 列和 file2.txt 的第 10 列怎么办?我将如何相应地更改代码? (2) 它在末尾输出标题,而不是将标题保留在第一行。我怎样才能将标题保持在顶部?再次感谢!
      • 哦,还有一个警告 (3),出于某种奇怪的原因,输出在第 1 列和第 2 列之间没有制表符分隔。
      • perl -v 这是为 x86_64-linux-thread-multi 构建的 perl,v5.8.8
      • 哈哈哈刚试了最后一个版本,但我仍然有同样的问题(1)-(3)不知道为什么,很奇怪。
      • 另外,当没有数据时,如何添加制表符分隔的 NA?可能吗?我仍然遇到底部标题的警告,不知何故在文件 1 和文件 2 的最后一列之间没有标签,正如我所说的没有 NAs ......谢谢,很抱歉一直打扰你。
      猜你喜欢
      • 1970-01-01
      • 2018-07-07
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多