簡體   English   中英

在列上使用 bash comm 命令但返回整行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM