[英]Using bash comm command on columns but returning the entire line
我有兩個文件,每個文件有兩列,僅按第二列排序,例如:
File 1:
176 AAATC
6 CCGTG
80 TTTCG
File 2:
20 AAATC
77 CTTTT
50 TTTTT
我想使用帶有選項 -13 和 -23 的 comm 命令來獲取兩個不同的文件,這些文件報告兩個文件之間具有相應計數的不同行,但只比較第二列(即字符串)。 到目前為止我嘗試過的是:
comm -23 <(cut -d$'\t' -f2 file1.txt) <(cut -d$'\t' -f2 file2.txt)
但是我只能在輸出中輸入字符串,而沒有數字:
CCGTG
TTTCG
雖然我想要的是:
6 CCGTG
80 TTTCG
有什么建議嗎?
謝謝!
您可以使用join
而不是comm
:
join -1 2 -2 2 File1 File2 -a 1 -o 1.1,1.2,2.2
它也會輸出匹配的行,但您可以刪除它們
| grep -v '[ACTG] [ACTG]'
解釋:
-1 2
使用文件 1 中的第二列進行連接;-2 2
同樣,使用文件 2 中的第二列;-a 1
還顯示文件 1 中不匹配的行 - 這些是您最終想要的;-o
指定輸出格式,這里我們需要文件 1 中的第 1 列和第 2 列以及文件 2 中的第 2 列(這只是任意的,您也可以使用第 1 列,但第二個命令會有所不同: | grep -v '[ACTG] [0-9]'
)。 comm
不是這項工作的正確工具,雖然join
可以工作,但您還需要查看運行join
兩次,然后使用其他一些命令(例如grep
)進一步過濾結果。
一個需要對每個輸入文件進行一次傳遞的awk
想法:
awk 'BEGIN {FS=OFS="\t"}
FNR==NR { f1[$2]=$1; next } # save 1st file entries
$2 in f1 { delete f1[$2]; next } # 2nd file: if $2 in f1[] then delete f1[] entry and skip this line else ..
{ f2[$2]=$1 } # save 2nd file entries
END { # at this point:
# f1[] contains rows where field #2 only exists in the 1st file
# f2[] contains rows where field #2 only exists in the 2nd file
PROCINFO["sorted_in"]="@ind_str_asc"
for (i in f1) print f1[i],i > "file-23"
for (i in f2) print f2[i],i > "file-13"
}
' file1 file2
注意: PROCINFO["sorted_in"]
行需要GNU awk
; 沒有這一行,我們無法保證寫入最終輸出文件的順序,然后 OP 需要添加更多( awk
)代碼來維護排序或使用另一個操作系統級實用程序(例如sort
)對最終文件進行排序
這會產生:
$ cat file-23
6 CCGTG
80 TTTCG
$ cat file-13
77 CTTTT
50 TTTTT
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.