如果小于N%,删除数值

时间:2017-09-14 15:13:32

标签: regex linux unix sed grep

我需要删除某些文本文件中小于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

3 个答案:

答案 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