从包含大于5000的数字的文本文件中复制每一行


0

嗨,我已经尝试过许多解决类似问题的方法,但似乎没有一种对我有用。我有一个文本文件,其中每一行在字符串“ length_”之后都有未定义的数字长度。如何选择该数字等于或大于5000的所有行?到目前为止,这是我尝试过的最干净的代码尝试,但是它仍然只会生成一个空文件(即使file1肯定包含数字大于5000的行)

grep --regexp="length_\"[5-9][0-9]\{3,\}\"" file1.txt > file2.txt

输入文本文件内例如信息:
/file/path/xx00:>TEXT_1_length_81903_cov_10.5145_
/file/path/xx01:>TEXT_2_length_348971_cov_13.6753_
/file/path/xx02:>TEXT_3_length_4989_cov_11.9516_
/文件/路径/ XX03:> TEXT_4_length_29811_cov_13。 7948_
/file/path/xx03:>TEXT_5_length_2567_cov_13.7948_

输出文本文件中的所需示例信息:
/ file/ path
/
xx00 :> TEXT_1_length_81903_cov_10.5145_ /file/path/xx01:>TEXT_2_length_348971_cov_13.6753_ /file/path/xx03:>NODE_4_length_29811_cov_13.7948_


请从样本输入文件中发布几行,并组成一个相应的结果文件(即,向我们显示您拥有的确切输入和预期的确切输出)。
tniles

您要大于还是小于?
Jeff Schaller

鉴于您的实际输入文件不是以“ length_”开头,因此我相应地更新了答案。
Jeff Schaller

Answers:


2

这是一种使用awk从文件中打印行的方法,该文件的行“ length_”后面的数字小于或等于5000:

awk '{sub("length_", "", $0); if ($0 <= 5000) { print "length_"$0 } }' input

它只是告诉awk剥离“ length_”字符串,然后将行的其余部分与5000进行比较;如果小于或等于5000,则打印“ length_”和该行的其余部分。您的Q主题行(当时)说“大于5000”,因此,如果这是实际需要,只需在awk中更改比较:

awk '{sub("length_", "", $0); if ($0 > 5000) { print "length_"$0 } }' input

给定实际的文件格式,awk命令可以大大简化:

awk -F_ '$4 > 5000' input

要么

awk -F_ '$4 <= 5000' input

通过告诉awk根据下划线拆分字段,然后将第四个字段与5000进行比较。如果比较为true,则(默认)打印。


第二种解决方案使用下划线作为字段分隔符,然后过滤包含大于5000的数字的列,则效果很好。漂亮的解决方案。
吉尔斯

1
grep -E '_length_([5-9][0-9]{3}|[0-9]{5,})_' file1.txt > file2.txt

输出包含以下内容的行:

  • _length_ 其次是:
    • 5- 9和另外3位数字(5000-9999)
    • 5位或更多数字(10000+)
  • 其次是_
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.