BASH comm 命令,但适用于多列

标签 bash unique comm

我正在寻找类似于 bash 命令 comm 的东西,我可以用它来选择我的 2 个文件所特有的条目和它们所共有的条目。 当我每个文件只有一列时,Comm 工作得很好,例如。

 comm -13 FILE1.txt FILE2.txt > Entries_only_in_file1.txt

但现在我希望保留多列信息。我想选择第 2 列作为筛选行以查找两个文件之间唯一和常见条目的行。如果第二列中的条目出现在两个文件中,我还想在第 3、4 和 5 列中记录信息(如果可能,这并不那么重要)。 这是输入和输出的示例。

FILE1.txt
NM_023928   AACS    2   2   1
NM_182662   AADAT   2   2   1
NM_153698   AAED1   1   5   3
NM_001271   AAGAB   2   2   1


FILE2.txt
NM_153698   AAED1   2   5   3
NM_001271   AAGAB   2   2   1
NM_001605   AARS    3   40  37
NM_212533   ABCA2   3   4   2

想要的输出:

COMMON.txt
NM_153698   AAED1   1   5   3   2   5   3
NM_001271   AAGAB   2   2   1   2   2   1

UNIQUE_TO_1.txt
NM_023928   AACS    2   2   1
NM_182662   AADAT   2   2   1

UNIQUE_TO_2.txt
NM_001605   AARS    3   40  37
NM_212533   ABCA2   3   4   2

我知道以前也有过类似的问题,但我找不到我要找的东西。任何想法都非常感谢,谢谢。

最佳答案

join 具有以下对您的任务有用的选项:

  • -j FIELD:加入字段FIELD
  • -o FORMAT:指定输出格式,作为逗号分隔的 FILENUM.FIELD 列表。
  • -v FILENUM:仅在 FILENUM 上输出行。

两个文件共有的:

$ join -j2 -o 1.1,1.2,1.3,1.4,1.5,2.3,2.4,2.5 FILE1.txt FILE2.txt 
NM_153698 AAED1 1 5 3 2 5 3
NM_001271 AAGAB 2 2 1 2 2 1

FILE1 独有的:

$ join -j2 -v1 FILE1.txt FILE2.txt 
AACS NM_023928 2 2 1
AADAT NM_182662 2 2 1

FILE2 独有的:

$ join -j2 -v2 FILE1.txt FILE2.txt 
AARS NM_001605 3 40 37
ABCA2 NM_212533 3 4 2

关于BASH comm 命令,但适用于多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37170326/

相关文章:

ruby - 当前行以 ^M 结尾时追加文件中的下一行

linux - 将 linux cout 重定向到脚本中的变量和屏幕

bash - 如何在不排序的情况下删除两个文件之间的公共(public)行?

linux - 用于存放 Linux 配置文件的 Bash 脚本不适用于主目录或现有文件夹根目录中的文件

bash - Shell-Script Python 调用失败并出现语法错误

mysql - MySQL 如何确定 INSERT 是否唯一?

Java尝试用唯一的数字填充int数组

sql - "one-to-many"关系上的唯一约束(无触发器)

linux - 删除通讯输出中的空格

awk - 在包含单列值的多个文件中查找共同值