Awk 使用sed删除特定列的小数

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,国际

我正在处理一个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;;

我试过这个代码:

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
详情:

  • ^
    -字符串的开头
  • \(\([^;]*;\)\{5\}[0-9]*\)
    -第1组(
    \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