我有兩個檔案,每個檔案有兩列,僅按第二列排序,例如:
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
有什么建議嗎?
謝謝!
uj5u.com熱心網友回復:
您可以使用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]'。
uj5u.com熱心網友回復:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/359778.html
上一篇:Pandas:根據列名重新排序列
