在列上使用 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 命令但返回整行的主要内容,如果未能解决你的问题,请参考以下文章
我正在使用awk命令,但无法使用shell脚本在列中打印IP