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

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

您好,我已经尝试了很多类似问题的解决方案,但似乎没有一个对我有用。我有一个文本文件,其中每行在字符串“ 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_
/file/path/xx03:>TEXT_4 _length_29811_cov_13。第7948
章 /文件/路径/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_

答案1

这是使用 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 进行比较。如果比较为真,则(默认情况下)打印。

答案2

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

输出行包含:

  • _length_随后是:
    • 5-9以及另外 3 位数字 (5000-9999)或者
    • 5 位或更多数字(10000+)
  • 其次是_

相关内容