用sed删除特定列的小数



我正在处理一个csv文件,我想用特定列的小数截断数字。其中三条线路是:

123;rr;2.RRyO,国际象棋mobil;pio25.766;1.0;24353;21.876;;S

1243;rho;9;RpO,国际象棋yext cat;倾盆大雨67.98;1.0;237753;25.346;;S

1243;rho;9;RpO,国际象棋yext cat;pio73;1.0;237753;25.346;;S

我想要这个输出:

123;rr;2.RRyO,国际象棋mobil;pio25;1.0;24353;21.876;;S

1243;rho;9;RpO,国际象棋yext cat;倾盆大雨67;1.0;237753;25.346;;S

1243;rho;9;RpO,国际象棋yext cat;pio73;1.0;237753;25.346;;S

我试过他们的代码:

sed  -e '/^.+pio$/,/^..*;[[:digit:]];[[:digit:]];.*;.*;.*;.*[[:space:]]$/d' data.csv

但不起作用。。。有什么建议吗?

使用您显示的示例,请尝试以下操作。您可以通过awk的sprintf函数简单地将浮点转换为数字。

awk 'BEGIN{FS=OFS=";"} {$6=sprintf("%d",$6)} 1' Input_file

来自awk:的手册页

sprintf(fmt,expr list(根据fmt打印expr list,并返回生成的字符串。

我还没有完全逆向工程您的sed命令,但这似乎很有效:

sed 's/(.*pio;[0-9]*).[0-9]*/1/' data.csv

您可以使用

sed 's/^(([^;]*;){5}[0-9]*)[^;]*/1/' data.csv

详细信息

  • ^-字符串的开头
  • (([^;]*;){5}[0-9]*)-第1组(1(:
    • ([^;]*;){5}-除;;之外的任何零个或多个字符出现五次
    • [0-9]*-零位或多位
  • [^;]*-除;之外的零个或多个字符

查看在线演示:

s='123;rr;2;RRyO, chess mobil;pio;25.766;1;0;24353;21.876;;S
1243;rho;9;RpO, chess yext cat;downpio;67.98;1;0;237753;25.346;;S
1243;rho;9;RpO, chess yext cat;pio;73;1;0;237753;25.346;;S'
sed 's/^(([^;]*;){5}[0-9]*)[^;]*/1/' <<< "$s"

输出:

123;rr;2;RRyO, chess mobil;pio;25;1;0;24353;21.876;;S
1243;rho;9;RpO, chess yext cat;downpio;67;1;0;237753;25.346;;S
1243;rho;9;RpO, chess yext cat;pio;73;1;0;237753;25.346;;S

这可能对你有用(GNU sed(:

sed -E 's/([0-9]+)(.[0-9]+)?|([^;]+)/13/6' file

字段可以是数字、带小数的数字,也可以不是数字。

在第六个这样的字段中,仅当数字部分存在时才返回数字部分。

相关内容

  • 没有找到相关文章

最新更新