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!我没有注意到我写的条件不够好。现在,我测试了你的代码,它就像一个符咒。刚刚更新了我的答案。