我需要删除某些文本文件中小于30%
的任何数值。下面是文本文件内容和我用来实现此目的的当前代码。
我正在寻找一种更好,更有效的方法来实现这一目标。
file1.csv
25%
80%
22%
67%
45%
30%
15%
5%
13%
file2.csv
25% 80% 22% 67% 45% 30% 15% 5% 13%
代码:
sed -i 's/30%//g' file.csv
sed -i 's/29%//g' file.csv
sed -i 's/28%//g' file.csv
sed -i 's/27%//g' file.csv
sed -i 's/26%//g' file.csv
sed -i 's/25%//g' file.csv
sed -i 's/24%//g' file.csv
sed -i 's/23%//g' file.csv
sed -i 's/22%//g' file.csv
sed -i 's/21%//g' file.csv
sed -i 's/20%//g' file.csv
sed -i 's/19%//g' file.csv
sed -i 's/18%//g' file.csv
sed -i 's/17%//g' file.csv
sed -i 's/16%//g' file.csv
sed -i 's/15%//g' file.csv
sed -i 's/14%//g' file.csv
sed -i 's/13%//g' file.csv
sed -i 's/12%//g' file.csv
sed -i 's/11%//g' file.csv
sed -i 's/10%//g' file.csv
sed -i 's/9%//g' file.csv
sed -i 's/8%//g' file.csv
sed -i 's/7%//g' file.csv
sed -i 's/6%//g' file.csv
sed -i 's/5%//g' file.csv
sed -i 's/4%//g' file.csv
sed -i 's/3%//g' file.csv
sed -i 's/2%//g' file.csv
sed -i 's/1%//g' file.csv
sed -i 's/0%//g' file.csv
答案 0 :(得分:1)
尝试使用简单的awk。
awk '$0+0>=30' Input_file
将每行的数字值与30进行比较,如果它们等于或大于30,则打印它们。(基本上awk适用于条件然后动作的方法,所以这里我没有提及任何动作,所以每当条件为真时它将执行默认操作,即打印当前行。)
如果您需要将新输出保存到相同的Input_file中,请运行以下命令。
awk '$0+0>=30' Input_file > temp_file && mv temp_file Input_file
编辑:由于OP添加了另外一种要处理的文件类型,因此现在也添加此解决方案。
awk '{for(i=1;i<=NF;i++){if($i+0>=30){printf("%s%s",$i,i==NF?"":" ")}};print ""}' file2.csv
答案 1 :(得分:1)
只需 sed :
sed -Ei '/^([0-9]|[12][0-9])%/d' file.csv
d
- 子命令,删除与模式匹配的行输出:
80%
67%
45%
30%
注意,要同时检测30%
您的情况应设置为小于或等于 30%
<强> ---------- 强>
要从单行文件中过滤掉值,请使用以下命令:
sed -Ei 's/[[:space:]]*\<([0-9]|[12][0-9])%//g' file2.csv
输出:
80% 67% 45% 30%
答案 2 :(得分:1)
如果您不介意使用 Perl
对于您的多行或单行,您可以:
perl -pe 's/[0-2][0-9]%|^[0-9]%| +[0-9]%//g' file
如果您不想要空行,请尝试:
perl -pe 's/[0-2][0-9]%|^[0-9]%| +[0-9]%//g && s/\r?\n//g' file
perl -lne 'print $& while /[3-9][0-9]%/g' file
grep
的 -P
grep -Po '[3-9][0-9]%' file