我需要将一个文件(24 行)grep 成两个文件(有点大)。
原始文件包含 24 行类似于此字符串:
AATGGACGCTTAAC[A|C|T][A|C|G]CGGC[A|T]TCGGAT
我执行以下操作:
grep -f aList hugeFile_N*.csv | wc -l
4396868
然后,为了仔细检查一切是否正常,我将文件分成两个文件,并通过另一个 grep 使用它们:
cat aList | head -n 12 > firstHalf
cat aList | tail -n +13 > secondHalf
grep -f firstHalf hugeFile_N*.csv | wc -l
2169008
grep -f secondHalf hugeFile_N*.csv | wc -l
2228046
现在,我期望来自两个单独的 grepped 文件的匹配总数将等于我为原始文件找到的匹配数。但是,如您所见:
2169008 + 2228046 = 4397054
4397054 != 4396868
不是这种情况。我们有 186 场比赛丢失。这里发生了什么?
我还对(实际上非常简单的)文件进行了一些调查。在这里,我从两个单独的部分 grep 的结果:
grep -f <(cat firstHalf secondHalf) hugeFile_N*.csv > together
然后我分别 grep 两半:
grep -f firstHalf hugeFile_N*.csv > separately
grep -f secondHalf hugeFile_N*.csv >> separately
而且,如前所述,匹配的数量是不同的:
wc -l together
4396868 together
wc -l separately
4397054 separately
但是,唯一匹配的数量是相同的:
sort -u together | wc -l
3735836
sort -u separately | wc -l
3735836
有趣的是,如果我 grep 原始文件中的两半,我根本没有匹配项。我想知道为什么会这样:
grep -f ../code/firstHalf ../code/aList | wc -l
0
grep -f ../code/secondHalf ../code/aList | wc -l
0
我 100% 确定两半都存在,aList
因为我可以用我的编辑器看到它(它们每行 12 行,所以肉眼甚至不难看到)。
我觉得我做错了grep
什么但是......什么?
里面的所有线条aList
都是独一无二的。
grep
只查找至少匹配给定模式之一的行。中的24 个模式aList
,可能前半场中的一个和后半场中的一个匹配。这意味着您将在同一行上获得 和 的匹配grep -f firstHalf
项grep -f secondHalf
。分别运行模式列表的两半会加倍计算这些行。例如
但当然还有:
并且 2+2 > 3。
如果所有行都不同,那么计算唯一匹配行当然是消除这种影响的一种方法。您可以使用
grep -n
将行号添加到输出中,使每个输出行都是唯一的。当然请记住,默认情况下grep
会在行中的任何位置查找匹配项,如果这不是您想要的,您需要使用grep -x
.另请注意,这意味着
[A|C|T]
匹配任何字符A
、或。如果您不想或不需要匹配管道字符,请使用. 或者,如果您需要交替,则必须使用扩展的正则表达式 ( ),然后(带括号,而不是括号)。但这不是必需的,只要所有替代项都是单个字符。C
T
|
[ACT]
grep -E
(this|that)