Awk 使用sed删除特定列的小数
我正在处理一个csv文件,我想用特定列的小数截断数字。 其中三行是: 123;rr;2.国际象棋协会;pio25.766;1.0;24353;21.876;; 1243;rho;9;RpO,国际象棋下一只猫;唐皮奥67.98;1.0;237753;25.346;; 1243;rho;9;RpO,国际象棋下一只猫;pio73;1.0;237753;25.346;; 我想要这个输出: 123;rr;2.国际象棋协会;pio25;1.0;24353;21.876;; 1243;rho;9;RpO,国际象棋下一只猫;唐皮奥67;1.0;237753;25.346;; 1243;rho;9;RpO,国际象棋下一只猫;pio73;1.0;237753;25.346;; 我试过这个代码:Awk 使用sed删除特定列的小数,awk,sed,replace,decimal,truncate,Awk,Sed,Replace,Decimal,Truncate,我正在处理一个csv文件,我想用特定列的小数截断数字。 其中三行是: 123;rr;2.国际象棋协会;pio25.766;1.0;24353;21.876;; 1243;rho;9;RpO,国际象棋下一只猫;唐皮奥67.98;1.0;237753;25.346;; 1243;rho;9;RpO,国际象棋下一只猫;pio73;1.0;237753;25.346;; 我想要这个输出: 123;rr;2.国际象棋协会;pio25;1.0;24353;21.876;; 1243;rho;9;RpO,国际
sed -e '/^.\+pio$/,/^\..\*;[[:digit:]];[[:digit:]];.\*;.\*;.\*;.\*[[:space:]]$/d' data.csv
但是不起作用。。。
有什么建议吗?我还没有完全对您的sed命令进行反向工程,但这似乎有效:
sed 's/\(.*pio;[0-9]*\)\.[0-9]*/\1/' data.csv
你可以用
sed的/^\(\([^;]*;\)\{5\}[0-9]*\)[^;]*/\1/'data.csv
详情:
-字符串的开头^
-第1组(\(\([^;]*;\)\{5\}[0-9]*\)
):\1
-除\([^;]*;\)\{5\}
以外的任何零个或多个字符出现五次代码>和a
代码>
-零位或更多位[0-9]*
-零个或多个字符,而不是[^;]*
代码>
s='123;rr;2.国际象棋协会;pio;25.766;1.0;24353;21.876;;s
1243;rho;9;RpO,国际象棋下一只猫;唐皮奥;67.98;1.0;237753;25.346;;s
1243;rho;9;RpO,国际象棋下一只猫;pio;73;1.0;237753;25.346;;是的
sed的/^\(\([^;]*;\)\{5\}[0-9]*\)[^;]*/\1/'对于显示的示例,请尝试以下内容。您可以通过awk
的sprintf函数简单地将浮点转换为数字
awk 'BEGIN{FS=OFS=";"} {$6=sprintf("%d",$6)} 1' Input_file
从awk
的手册页:
sprintf(fmt,expr list)根据fmt打印expr list,并返回
结果字符串
这可能适用于您(GNU-sed):
字段可以是数字、带小数点的数字或非数字
在第六个这样的字段中,仅当数字部分存在时才返回它。sed-E的/^(([^;]*;){5}[0-9]*)[^;]*/\1/'data.csv
可以。非常感谢!作品
sed -E 's/([0-9]+)(\.[0-9]+)?|([^;]+)/\1\3/6' file