使用 sed 删除特定列的小数

Delete decimals of a specific columns with sed

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

123;rr;2;RRyO, chess mobil;pio;25.766;1;0;24353;21.876;;S

1243;rho;9;RpO, chess yext cat;down​​pio;67.98;1;0;237753;25.346;;S

1243;rho;9;RpO, chess yext cat;pio;73;1;0;237753;25.346;;S

我想要这个输出:

123;rr;2;RRyO, chess mobil;pio;25;1;0;24353;21.876;;S

1243;rho;9;RpO, chess yext cat;down​​pio;67;1;0;237753;25.346;;S

1243;rho;9;RpO, chess yext cat;pio;73;1;0;237753;25.346;;S

我试过这个代码:

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

但是没用... 有什么建议吗?

我还没有对你的 sed 命令进行完全逆向工程,但这似乎有效:

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

您可以使用

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

详情:

  • ^ - 字符串开头
  • \(\([^;]*;\)\{5\}[0-9]*\) - 第 1 组 (</code>): <ul> <li><code>\([^;]*;\)\{5\} - 除 ;;
  • 之外的任意零个或多个字符出现五次
  • [0-9]* - 零个或多个数字
  • [^;]* - ;.
  • 以外的零个或多个字符

    参见online demo

    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]*\)[^;]*//' <<< "$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
    

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

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

    来自 awk 的手册页:

    sprintf(fmt, expr-list) Print expr-list according to fmt, and return the resulting string.

    这可能适合您 (GNU sed):

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

    字段可以是数字,带小数点的数字或不带小数点的数字。

    第六个这样的字段return只有数字部分存在。