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==FNR
as 条件仅针对第一个输入fle1而不是file2运行其后续块,因为NR
inawk
指的是当前处理行号,FNR
并且指的是所有输入中的当前行号。soNR
对每个输入文件FNR
都是唯一的,但对所有输入都是唯一的。
该next
是有说服力awk
不继续休息码,直到再次启动NR
婉不等于FNR
该装置的所有行文件1阅读awk
。
然后接下来seen[$0]
将只运行第二个文件2中和每行文件2将寻找到阵列,并将打印行,其中的确存在数组。
另一个简单的选择是使用sort
and 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)