我正在处理一个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
字段可以是数字、带小数的数字,也可以不是数字。
在第六个这样的字段中,仅当数字部分存在时才返回数字部分。