如果第3列中的值在另一个文本文件中,则删除行

时间:2016-06-08 13:21:45

标签: bash unix

我有一个长文本文件( haplotypes.txt ),如下所示:

19 rs541392352 55101281 A 0 0 ...
19 rs546022921 55106773 C T 0 ...
19 rs531959574 31298342 T 0 0 ...

一个简单的文本文件( positions.txt ),如下所示:

55103603
55106773
55107854
55112489

如果要删除 positions.txt 中存在第三个字段的所有行,请获取以下输出:

19 rs541392352 55101281 A 0 0 ...
19 rs531959574 31298342 T 0 0 ...

我希望有人可以提供帮助。

2 个答案:

答案 0 :(得分:1)

这应该有效:

$ grep -vwFf positions.txt haplotypes.txt 
19 rs541392352 55101281 A 0 0 ...
19 rs531959574 31298342 T 0 0 ...
  • -f positions.txt:从文件中读取模式
  • -v:反转匹配
  • -w:仅匹配完整的单词(避免子字符串匹配)
  • -F:修复字符串匹配(不要将模式解释为正则表达式)

这预计只有第三列看起来像一个长数字。如果模式恰好与未显示的其中一列中的完全相同的单词匹配,则可能会出现误报。为避免这种情况,您必须使用按列过滤的awk解决方案(请参阅andlrc's answer)。

答案 1 :(得分:1)

使用AWK:

awk 'NR == FNR{a[$0] = 1;next}!a[$3]' positions.txt haplotypes.txt

故障:

NR == FNR { # If file is 'positions.txt'
  a[$0] = 1 # Store line as key in associtive array 'a'
  next      # Skip next blocks
}
!a[$3]      # Print if third column is not in the array 'a'