您好,我已经尝试了很多类似问题的解决方案,但似乎没有一个对我有用。我有一个文本文件,其中每行在字符串“ 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+)
- 其次是
_
。