Linux

如果它們以相同的名稱開頭,則選擇每兩行

  • September 14, 2017

我有一個看起來像這樣的表:

    name                             something 
1    100036498|F|0--20:T>G            something
2    100036501|F|0--44:C>T            something     
3    100036501|F|0-44:C>T-44:C>T      something   
4    100036508|F|0--66:T>G            something  
5    100036508|F|0-66:T>G-66:T>G      something  
6    100036511|F|0-19:G>A-19:G>A      something 
7    100036516|F|0--15:T>G            something 
8    100036516|F|0-15:T>G-15:T>G      something 
          ...                         ....

我添加了行號,以便更容易理解我的問題。有一些行對以相同的數字開頭,如第 2 行和第 3 行、第 4 行和第 5 行、第 7 行和第 8 行。還有一些行是唯一的,如第 1 行和第 6 行。我想只保留有一對的行或者換句話說,消除沒有一對的行以擁有這樣的表:

    name                             something 
2    100036501|F|0--44:C>T            something     
3    100036501|F|0-44:C>T-44:C>T      something   
4    100036508|F|0--66:T>G            something  
5    100036508|F|0-66:T>G-66:T>G      something   
7    100036516|F|0--15:T>G            something 
8    100036516|F|0-15:T>G-15:T>G      something 
          ...                         ....

我想要類似於 linux 命令uniq的相反的東西,只考慮第一列的數字,而不是 simbole |之後的其餘部分。.

你知道怎麼做嗎?

下面是相同的第一個表,列用一個空格分隔,沒有標題,以便更容易複製。

100036498|F|0--20:T>G something
100036501|F|0--44:C>T something     
100036501|F|0-44:C>T-44:C>T something
100036508|F|0--66:T>G something
100036508|F|0-66:T>G-66:T>G something
100036511|F|0-19:G>A-19:G>A something
100036516|F|0--15:T>G something
100036516|F|0-15:T>G-15:T>G something 

這是一個awk解決方案,它保留那些重複不止一次的行,如果你希望那些只重複兩次,更改>1==2

awk -F'|' 'NR==FNR{s[$1]++;next} (s[$1]>1)' infile infile
100036501|F|0--44:C>T            something
100036501|F|0-44:C>T-44:C>T      something
100036508|F|0--66:T>G            something
100036508|F|0-66:T>G-66:T>G      something
100036516|F|0--15:T>G            something
100036516|F|0-15:T>G-15:T>G      something

引用自:https://unix.stackexchange.com/questions/392120