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

Posted

技术标签:

【中文标题】在列上使用 bash comm 命令但返回整行【英文标题】:Using bash comm command on columns but returning the entire line 【发布时间】: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 个输出文件的内容;第二列中的值可以在任一输入文件中多次出现吗? 【参考方案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]') .

【讨论】:

以上是关于在列上使用 bash comm 命令但返回整行的主要内容,如果未能解决你的问题,请参考以下文章

带有输入的 Bash 函数失败 awk 命令

我正在使用awk命令,但无法使用shell脚本在列中打印IP

SQL:根据另一列的值在列上保留一个具有最大值的行

在列上使用 SetOrdinal() 后如何更新 DataGridView

Pandas 数据框在列上使用索引和条件进行选择

如何强制 Kendo Grid 在列上使用数字过滤器