【问题标题】:merge two files by key if exists in the first file / bash script [duplicate]如果第一个文件/ bash脚本中存在,则按键合并两个文件[重复]
【发布时间】:2012-05-09 00:25:28
【问题描述】:

我有两个文件的列按第一列的值排序,我只想在第二列的值存在于第一列的情况下合并它们。

第一个文件是这样的

man01 xxx yyy zzz
man02 xxx yyy zzz
man03 xxx yyy zzz
man04 xxx yyy zzz

第二个文件

man01 sss
man08 sss

而想要的输出是

man01 xxx yyy zzz sss
man02 xxx yyy zzz
man03 xxx yyy zzz
man04 xxx yyy zzz

我尝试加入但要求第二个文件的值存在于第一个文件中:/

【问题讨论】:

  • 记录之间有空行吗?
  • 对于 Perl 来说看起来不错,不是吗? (如果有人能想到使用基本工具解决这个问题的合理方法,我会印象深刻!)
  • 我没有太多时间,但commpaste 可以证明很方便,阅读他们的man 页面
  • 别等了,这是join 的工作:)

标签: file bash unix join merge


【解决方案1】:

加入可以做到这一点,你考虑过-a这个选项吗?它将为 a.txt 和 b.txt 中每个不可配对的文件行生成一行。

join -a1 a.txt b.txt

man01 xxx yyy zzz sss
man02 xxx yyy zzz
man03 xxx yyy zzz
man04 xxx yyy zzz

【讨论】:

  • 哇!是的!做到了! :D 谢谢!!
【解决方案2】:

好吧,这不是优雅的命令行用法的美妙之处,但这又如何呢?

perl -we 'open F1, "<file1.txt"; open F2, "<file2.txt"; my %f2 = map {/(\S+)/ ? ($1=>$_) : ()} <F2>; while (<F1>) { chomp; print; if (/(\S+)/ && exists $f2{$1}) { $f2{$1} =~ /\S+\s+(.*)/ and print " $1"; } print "\n"; }'

更新:当我处理上述问题时,@bunting 和 @c00kiemon5ter 似乎想出了一个更优雅的答案。太棒了!

【讨论】:

    猜你喜欢
    • 2018-01-04
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    相关资源
    最近更新 更多