Awk
Comapring 2 個文件中的列並列印不同的值
我有一個看起來像這樣的文件(file-1),
DIP-10097N|refseq:NP_416170|uniprotkb:P30015 DIP-10117N|refseq:NP_414973|uniprotkb:P08177 DIP-10168N|refseq:NP_418766|uniprotkb:P15005 DIP-10199N|refseq:NP_415632|uniprotkb:P30958 DIP-10358N|refseq:NP_418659|uniprotkb:P28903 DIP-10440N|refseq:NP_289596|uniprotkb:P20082 DIP-10441N|refseq:NP_417502|uniprotkb:P20083 DIP-10441N|refseq:NP_417502|uniprotkb:P20083 DIP-10467N|refseq:NP_415423|uniprotkb:P09373 DIP-10469N|refseq:NP_418386|uniprotkb:P32674 DIP-10562N|refseq:NP_418370|uniprotkb:P17888 DIP-10582N|refseq:NP_414864|uniprotkb:P77743 DIP-10592N|refseq:NP_415819|uniprotkb:P37344
和另一個看起來像這樣的(file-2),
DIP-10331N|refseq:NP_311078|uniprotkb:P12638 DIP-10117N|refseq:NP_414973|uniprotkb:P08177 DIP-10331N|refseq:NP_311078|uniprotkb:P12638 DIP-10840N|refseq:NP_414640|uniprotkb:P10408 DIP-1025N|refseq:NP_414574|uniprotkb:P00968 DIP-10097N|refseq:NP_416170|uniprotkb:P30015 DIP-10467N|refseq:NP_415423|uniprotkb:P09373 DIP-10097N|refseq:NP_416170|uniprotkb:P30015 DIP-10117N|refseq:NP_414973|uniprotkb:P08177 DIP-10117N|refseq:NP_414973|uniprotkb:P08177 DIP-10117N|refseq:NP_414973|uniprotkb:P08177 DIP-10750N|refseq:NP_289799|uniprotkb:P02410 DIP-10117N|refseq:NP_414973|uniprotkb:P08177 DIP-10757N|refseq:NP_288150|uniprotkb:P02421
在輸出中,我想列印 file-1 的內容加上 file-2 的任一列中的值,該值與另一列中 file-1 的值相同。像這樣,
DIP-10097N|refseq:NP_416170|uniprotkb:P30015 DIP-1025N|refseq:NP_414574|uniprotkb:P00968 DIP-10097N|refseq:NP_416170|uniprotkb:P30015 DIP-10467N|refseq:NP_415423|uniprotkb:P09373 DIP-10117N|refseq:NP_414973|uniprotkb:P08177 DIP-10117N|refseq:NP_414973|uniprotkb:P08177 DIP-10117N|refseq:NP_414973|uniprotkb:P08177 DIP-10750N|refseq:NP_289799|uniprotkb:P02410 DIP-10117N|refseq:NP_414973|uniprotkb:P08177 DIP-10757N|refseq:NP_288150|uniprotkb:P02421 DIP-10117N|refseq:NP_414973|uniprotkb:P08177 DIP-10331N|refseq:NP_311078|uniprotkb:P12638 DIP-10467N|refseq:NP_415423|uniprotkb:P09373 DIP-10097N|refseq:NP_416170|uniprotkb:P30015
有沒有辦法我可以使用 awk 或 grep 來做到這一點。任何幫助將不勝感激。
這是awk中廣為人知的操作——從密鑰文件中收集數組,然後使用該數組對第二個文件值進行操作
awk ' FNR==NR{ A[$2] = A[$2] " " $1 next } $1 in A{ for(i=1;i<=split(A[$1], B);i++) print $1 B[i] } ' file2 file1
或者更短一點:
awk ' FNR==NR{ A[$2] = A[$2] $2 " " $1 "\n" next } $1 in A{ printf "%s", A[$1] } ' file2 file1
其他變體
grep -f <(cat -E file1) file2 | sed 's/\(\S*\)\s*\(\S*\)/\2\t\1/' | sort
最後最簡單(至於我):
join -2 2 file1 <(sort -k2 file2)