【问题标题】:Delete decimals of a specific columns with sed使用 sed 删除特定列的小数
【发布时间】:2021-07-22 01:15:16
【问题描述】:

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

123;rr;2;RRyO, 国际象棋移动;pio;25.766;1;0;24353;21.876;;S

1243;rho;9;RpO, 国际象棋 yext 猫;down​​pio;67.98;1;0;237753;25.346;;S

1243;rho;9;RpO, 国际象棋 yext 猫;pio;73;1;0;237753;25.346;;S

我想要这个输出:

123;rr;2;RRyO, 国际象棋移动;pio;25;1;0;24353;21.876;;S

1243;rho;9;RpO, 国际象棋 yext 猫;down​​pio;67;1;0;237753;25.346;;S

1243;rho;9;RpO, 国际象棋 yext 猫;pio;73;1;0;237753;25.346;;S

我已经尝试过这个代码:

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

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

【问题讨论】:

  • sed -E 's/^(([^;]*;){5}[0-9]*)[^;]*/\1/' data.csv 可能会。

标签: awk sed replace decimal truncate


【解决方案1】:

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

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

字段可以是数字、带小数的数字或非数字。

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

【讨论】:

    【解决方案2】:

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

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

    来自awk的手册页:

    sprintf(fmt, expr-list) 根据fmt打印expr-list,并返回 结果字符串。

    【讨论】:

      【解决方案3】:

      你可以使用

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

      详情

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2011-12-21
          • 1970-01-01
          • 1970-01-01
          • 2017-01-04
          • 2020-02-25
          • 2020-05-07
          • 1970-01-01
          • 1970-01-01
          • 2017-10-13
          相关资源
          最近更新 更多