【问题标题】:Using bash comm command on columns but returning the entire line在列上使用 bash comm 命令但返回整行
【发布时间】:2021-12-26 17:35:16
【问题描述】:

我有两个文件,每个文件有两列,只按第二列排序,如:

File 1: 

176 AAATC
6   CCGTG
80  TTTCG

File 2:

20 AAATC
77 CTTTT
50 TTTTT

我想使用 comm 命令使用选项 -13 和 -23 来获取两个不同的文件,报告两个文件之间的不同行以及相应的计数,但只比较第二列(即字符串)。到目前为止,我尝试过的是:

comm -23 <(cut -d$'\t' -f2 file1.txt) <(cut -d$'\t' -f2 file2.txt)

但我只能输出字符串,没有数字:

 CCGTG
 TTTCG

而我想要的是:

 6  CCGTG
 80 TTTCG

有什么建议吗?

谢谢!

【问题讨论】:

  • 您已声明您需要 2 个输出文件;请更新问题以显示 2 个输出文件的内容;第二列中的值可以在任一输入文件中多次出现吗?

标签: bash sorting command comm


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以使用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]') .

    【讨论】:

      猜你喜欢
      • 2016-09-07
      • 2020-03-02
      • 2021-02-26
      • 2017-06-26
      • 1970-01-01
      • 2018-06-21
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多