Command line 如何按n筛选文件。一个字接一个字?

Command line 如何按n筛选文件。一个字接一个字?,command-line,sed,awk,pattern-matching,Command Line,Sed,Awk,Pattern Matching,我有一个有不同线条的大文件 我感兴趣的线路看起来很像: lcl|NC_005966.1_gene_59 scaffold441.6 99.74 390 1 0 1 390 34065 34454 0.0 715 lcl|NC_005966.1_gene_59 scaffold2333.4 89.23 390 42 0 1 390 3114 2725 1e-138 488 lcl|NC_005966.1_gene_60 scaffold

我有一个有不同线条的大文件

我感兴趣的线路看起来很像:

lcl|NC_005966.1_gene_59 scaffold441.6   99.74   390 1   0   1   390 34065   34454   0.0  715
lcl|NC_005966.1_gene_59 scaffold2333.4  89.23   390 42  0   1   390 3114    2725    1e-138   488
lcl|NC_005966.1_gene_60 scaffold441.6   100.00  186 0   0   1   186 34528   34713   1e-95    344
现在我想得到模式“lcl | NC|”后面的行,但前提是第三个单词(或行中的第n个单词)小于100

(在本例中是前两行,因为它们的数字是99.74和89.23)

接下来,应将它们保存到新文件中。

这样可以:

$ awk '$1 ~ /^lcl\|NC_/ && $3<100' file
lcl|NC_005966.1_gene_59 scaffold441.6   99.74   390 1   0   1   390 34065   34454   0.0  715
lcl|NC_005966.1_gene_59 scaffold2333.4  89.23   390 42  0   1   390 3114    2725    1e-138   488
这可以使它:

$ awk '$1 ~ /^lcl\|NC_/ && $3<100' file
lcl|NC_005966.1_gene_59 scaffold441.6   99.74   390 1   0   1   390 34065   34454   0.0  715
lcl|NC_005966.1_gene_59 scaffold2333.4  89.23   390 42  0   1   390 3114    2725    1e-138   488

+1用于进近,但您需要两次转义“|”,即
$1~“^lcl\\\|NC|”
而不是
$1~“^lcl | NC|”
。在编写时,
|
表示“或”,因为它是一个重元字符,所以它匹配以lcl开头的行或包含NC的行,您需要对其进行两次转义或使用
[|]
,因为它是字符串文本,所以由awk进行两次解析。实际上-您应该使用/。/而不是“。”:
$1~/^lcl\\124; NC/
来清楚地表明您正在进行重新比较,并将其简化一点。非常感谢您的改进,@EdMorton!我没有注意到我写的条件不够好。现在,我测试了你的代码,它就像一个符咒。刚刚更新了我的答案。+1用于该方法,但您需要两次逃逸“|”,即
$1~“^lcl\\\\|NC|”
而不是
$1~“^lcl | NC|”
。在编写时,
|
表示“或”,因为它是一个重元字符,所以它匹配以lcl开头的行或包含NC的行,您需要对其进行两次转义或使用
[|]
,因为它是字符串文本,所以由awk进行两次解析。实际上-您应该使用/。/而不是“。”:
$1~/^lcl\\124; NC/
来清楚地表明您正在进行重新比较,并将其简化一点。非常感谢您的改进,@EdMorton!我没有注意到我写的条件不够好。现在,我测试了你的代码,它就像一个符咒。刚刚更新了我的答案。