2016-06-08 25 views
-1

我還有很長的文本文件(haplotypes.txt),看起來像這樣:刪除行,如果在第3列的值是另一個文本文件

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 ... 

我希望有人能幫助。

+1

你有沒有嘗試過的東西?有很多類似的問題已經使用'awk'等做相同的問題。 – nu11p01n73R

回答

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)。

+0

這不會匹配文件中任何位置的'positions.txt'中的行。例如:55101281「而不僅僅是第三欄。 – andlrc

+0

@andlrc確切地說 - 如果OP的數據在行後面有很長的數字,這可能會有誤報。 –

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' 
相關問題