读取行

问题描述:

我有一个标签delimted文本文件,如下所示:读取行

file_1:

A1 13f Jos + 
B1 zh4 Kia - 
C2 nh2 Met - 
D3 5gh Lox + 
F4 w4t Nit - 

file_2

N3 6jg Jut - 
J8 76d Met + 
A1 99g Kia - 
M6 45k Qox + 
V2 87h Nit - 

我想提取的条目file_1其中第3列条目与file_2的第3列条目匹配,如下面的linux:

B1 zh4 Kia - 
    C2 nh2 Met -  
    F4 w4t Nit - 

请问comm-12 file_1.txt file_2.txt有帮助吗?请引导我

+0

我不明白。第一个输出线来自文件2,但第2和3行来自文件1. – choroba

+0

@choroba我编辑了这个问题。抱歉给你带来不便。 – Chudar

+1

不应该在'Met'之前出现'kia'这一行,对输出行的排序是否有任何要求? –

awk可能是最简单的在这里(在此保留file_1输入顺序):

$ awk 'NR==FNR { seen[$3]++; next } seen[$3]' file_2 file_1 

B1 zh4 Kia - 
C2 nh2 Met - 
F4 w4t Nit - 
  • 模式NR==FNR只匹配从第一输入文件(file_2)线,并构建所有3rd-的关联数组列值与动作{ seen[$3]++; next }

    • seen[$3]++是一个常见的习惯用法包含一组唯一字段值的关联:隐式地访问阵列seen中的密钥$3(第3个字段的值)创建第一次访问时该密钥的条目,并且后递增++给出条目非零值,其在布尔上下文中评估为真(下面讨论的模式利用)。
  • 由于在之前的动作的next,图案seen[$3]然后仅用于第二输入文件(file_1)执行,并且仅评估为真,如果第二文件的第三列的值也存在于所述第一文件。评估为真的模式隐式地打印手中的线。

+0

+1对于优秀的答案我有一个关于订单的问题,这会打印'Kia' 'Met'...有一种方法可以让订单遵循file2的顺序。问题在'Kia'之前显示'Met' –

+0

谢谢,@JayRajput。我假设OP的真正意图是保留'file_1'输入顺序,尽管最初的样本输出不一致(OP已经修正) – mklement0

+0

yup。看到了......现在等待OP接受您的答案 –

comm期望文件按列进行排序以进行比较,并且其参数之前的空格不是可选的。

但是可以提取与cut从文件2 grep值文件1的第三列中,并且提取物如果他们不能在任何其他列出现:

cut -f3 file_1 | grep -Ff- file_2 

线对应的顺序到file2,但。

B1  zh4  Kia  - 
C2  nh2  Met  - 
F4  w4t  Nit  - 

为了得到正确的顺序,我会用Perl:

perl -e 'until (eof) { 
      @F = split " ", <>; 
      $h{ $F[2] } = 1; 
     } 
     while (<>) { 
      @F = split " "; 
      print if $h{ $F[2] }; 
     }' file_1 file_2 

它首先将第三列($F[2])的file_1值到哈希%h,然后越过file_2和检查是否在散列中设置了列3的值。

awk答案。对于小文件这是可以的。对于大文件,整个行$0保存在数组中,所看到的数组将变得很大。

awk 'NR==FNR { seen[$3] = $0; next} $3 in seen {print seen[$3]}' file_2 file_1 

输出

A1 99g Kia - 
J8 76d Met + 
V2 87h Nit - 
+0

这是一个有趣的变化,但请注意,它只会在在'file_2'的第三列中没有重复;否则,您将失去输出行。 – mklement0