两个文件之间的公共行

Mar*_*man 25 diff awk text-processing uniq comm

我在我的终端上运行了以下代码。

LC_ALL=C && grep -F -f  genename2.txt hg38.hgnc.bed > hg38.hgnc.goi.bed
Run Code Online (Sandbox Code Playgroud)

这并没有给我两个文件之间的公共行。我在那里缺少什么?

αғs*_*нιη 64

使用comm -12 file1 file2得到两个文件共同线。

您可能还需要对文件进行排序才能comm按预期工作。

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

来自man comm

-1     suppress column 1 (lines unique to FILE1)
-2     suppress column 2 (lines unique to FILE2)
Run Code Online (Sandbox Code Playgroud)

或者使用grep命令,您需要添加-x选项以将整行作为匹配模式进行匹配。该F选项grep将匹配模式作为字符串而不是正则表达式匹配。

-1     suppress column 1 (lines unique to FILE1)
-2     suppress column 2 (lines unique to FILE2)
Run Code Online (Sandbox Code Playgroud)

或使用awk.

grep -Fxf file1 file2
Run Code Online (Sandbox Code Playgroud)

这被读取整行的文件1到称为阵列seen与所述密钥作为整行(在awk$0代表整个当前行)。

我们使用NR==FNRas 条件仅针对第一个输入fle1而不是file2运行其后续块,因为NRinawk指的是当前处理行号,FNR并且指的是所有输入中的当前行号。soNR对每个输入文件FNR都是唯一的,但对所有输入都是唯一的。

next是有说服力awk不继续休息码,直到再次启动NR婉不等于FNR该装置的所有行文件1阅读awk

然后接下来seen[$0]将只运行第二个文件2中和每行文件2将寻找到阵列,并将打印行,其中的确存在数组。

另一个简单的选择是使用sortand uniq

awk 'NR==FNR{seen[$0]=1; next} seen[$0]' file1 file2
Run Code Online (Sandbox Code Playgroud)

这将打印排序的两个文件,然后uniq -d仅打印重复的行。但是,当两个文件本身都没有重复的行时,这是授予的,否则即使两个文件中都有重复的行,也始终授予下面的权限。

sort file1 file2|uniq -d
Run Code Online (Sandbox Code Playgroud)