从 2 个文件中输出公共行,从一个输出文件中的两个文件中输出不常见行

use*_*373 3 text-processing files

我有 2 个文本文件。让我们将它们命名为 file1.txt 和 file2.txt

file1.txt 如下

chr10   181144  225933
chr10   181243  225933
chr10   181500  225933
chr10   226069  255828
chr10   255989  267134
chr10   255989  282777
chr10   267297  282777
chr10   282856  283524
chr10   283618  285377
chr10   285466  285995
Run Code Online (Sandbox Code Playgroud)

file2.txt 如下

chr10   181144  225933
chr10   181243  225933
chr10   181500  225933
chr10   255989  282777
chr10   267297  282777
chr10   282856  283524
chr10   375542  387138
chr10   386930  387138
chr10   387270  390748
chr10   390859  390938
chr10   391051  394580
chr10   394703  395270
Run Code Online (Sandbox Code Playgroud)

我想在单个文件中输出的是

  1. file1 和 file2 之间的所有公共行
  2. 文件 1 中的所有行但两者都不通用
  3. 文件 2 中的所有行但两者都不通用。

我写了一个 Perl 脚本来做到这一点,但我很确定必须有一个命令行或更简单的方法来做到这一点。

ste*_*ver 8

两个文件共有的行:

comm -12 file1.txt file2.txt > results.txt
Run Code Online (Sandbox Code Playgroud)

添加 file1.txt 独有的行:

comm -23 file1.txt file2.txt >> results.txt
Run Code Online (Sandbox Code Playgroud)

添加 file2.txt 独有的行:

comm -13 file1.txt file2.txt >> results.txt
Run Code Online (Sandbox Code Playgroud)

如果文件尚未排序,则必须事先排序,例如,如果您的 shell 支持进程替换

comm -12 <(sort file1.txt) <(sort file2.txt)
Run Code Online (Sandbox Code Playgroud)

等等。


cuo*_*glm 7

有一个comm命令来完成这项工作。但是您可以通过结合其他标准工具(如grepsortuniq、 )来实现join。这是一个解决方案 use grep,等效于 using comm

两个文件共有的行:

grep -xF -f file1 file2

comm -12 <(sort -u file1) <(sort -u file2)
Run Code Online (Sandbox Code Playgroud)

行仅在file1

grep -vxF -f file2 file1

comm -23 <(sort -u file1) <(sort -u file2)
Run Code Online (Sandbox Code Playgroud)

行仅在file2

grep -vxF -f file1 file2

comm -13 <(sort -u file1) <(sort -u file2)
Run Code Online (Sandbox Code Playgroud)