如何使用Bash通过Sed或Awk删除文本文件中数字大于4的条目?
用Sed/Awk过滤文本条目:删除数字大于4的内容,及范围过滤方案
首先,针对你要删除数字大于4的条目的需求,用Awk或者Sed都能轻松实现,先明确你的输入输出目标:
输入文本:
Coffee 3 chocolate 4,5 fish 2 tomatoes 6 ……
期望输出:Coffee 3 fish 2
方案1:用Awk处理(更直观,适合字段型结构)
Awk天生擅长处理结构化字段,考虑到你输入里的4,5可能是欧洲格式的小数(逗号作小数点),我们先统一格式再判断:
awk '{ gsub(/,/, ".", $0); # 把逗号换成点,统一小数格式 for (i=1; i<=NF; i+=2) { num = $(i+1) + 0; # 把字符串转成数字,自动忽略多余空格 if (num <= 4) { printf "%s %s ", $i, $(i+1); } } print "" }' your_file.txt | sed 's/ $//' # 去掉末尾多余的空格
这样处理后,4,5会被转为4.5(数值大于4),对应的chocolate条目会被过滤,正好得到你想要的输出。
方案2:用Sed处理(正则匹配方式)
如果更习惯用Sed的正则替换,可以把每个条目拆出来单独判断,再合并结果:
sed -E ' s/,/./g; # 先统一小数格式 :loop s/([[:alpha:]]+) ([0-9.]+)( |$)/\n\1 \2\n/g; # 把每个"名称+数字"条目拆成单独行 /^[[:alpha:]]+ ([0-9.]+)$/{ # 删除数字>4的条目:整数≥5,或4.x且x>0的小数 / ([5-9]|[0-9]{2,}|4\.[1-9][0-9]*)$/d; } s/\n([[:alpha:]]+ [0-9.]+)\n/ \1 /g; # 把保留的条目合并回一行 s/^ //; s/ $//; s/ +/ /g # 清理首尾和多余空格 ' your_file.txt
关于删除特定范围的数字及文字:完全可行!
不管你要删除数字在[a,b]闭区间、(a,b)开区间,还是其他自定义范围的条目,只要调整判断条件就能实现,举两个实用例子:
例子1:删除数字在2到4之间的条目(保留<2或>4的)
用Awk的话,修改判断逻辑即可:
awk '{ gsub(/,/, ".", $0); for (i=1; i<=NF; i+=2) { num = $(i+1) + 0; if (!(num >=2 && num <=4)) { # 只保留不在2-4范围内的条目 printf "%s %s ", $i, $(i+1); } } print "" }' your_file.txt | sed 's/ $//'
针对你的输入,会输出tomatoes 6(Coffee 3、fish 2都在2-4范围内被删除)。
例子2:删除数字在3.5到6之间的条目
用Sed的话,调整正则的匹配规则:
sed -E ' s/,/./g; :loop s/([[:alpha:]]+) ([0-9.]+)( |$)/\n\1 \2\n/g; /^[[:alpha:]]+ ([0-9.]+)$/{ # 删除3.5到6的数字:3.5及以上的小数、4-6的整数 / (3\.[5-9][0-9]*|[4-6]|6\.0*)$/d; } s/\n([[:alpha:]]+ [0-9.]+)\n/ \1 /g; s/^ //; s/ $//; s/ +/ /g ' your_file.txt
针对你的输入,会输出Coffee 3 fish 2(chocolate 4.5、tomatoes 6都在范围内被删除)。
内容的提问来源于stack exchange,提问作者CCC
相关产品推荐
相关产品推荐

