【问题标题】:awk or sed to change column value in a fileawk 或 sed 更改文件中的列值
【发布时间】:2013-05-09 04:56:47
【问题描述】:

我有一个csv文件,数据如下

16:47:07,3,r-4-VM,230000000.,0.466028518635,131072,0,0,0,60,0
16:47:11,3,r-4-VM,250000000.,0.50822578824,131072,0,0,0,0,0
16:47:14,3,r-4-VM,240000000.,0.488406067907,131072,0,0,32768,0,0
16:47:17,3,r-4-VM,230000000.,0.467893525702,131072,0,0,0,0,0

我想缩短第 5 列中的值。

期望的输出

16:47:07,3,r-4-VM,230000000.,0.46,131072,0,0,0,60,0
16:47:11,3,r-4-VM,250000000.,0.50,131072,0,0,0,0,0
16:47:14,3,r-4-VM,240000000.,0.48,131072,0,0,32768,0,0
16:47:17,3,r-4-VM,230000000.,0.46,131072,0,0,0,0,0

非常感谢您的帮助

【问题讨论】:

    标签: linux shell sed awk


    【解决方案1】:
    awk '{$5=sprintf( "%.2g", $5)} 1' OFS=, FS=, input
    

    这将四舍五入并在第一行打印.47 而不是.46,但这也许是可取的。

    【讨论】:

      【解决方案2】:

      试试这个:

      cat filename | sed 's/\(^.*\)\(0\.[0-9][0-9]\)[0-9]*\(,.*\)/\1\2\3/g'
      

      到目前为止,输出是 GNU/Linux 标准输出,所以

      cat filename | sed 's/\(^.*\)\(0\.[0-9][0-9]\)[0-9]*\(,.*\)/\1\2\3/g' > out_filename
      

      将所需结果发送至out_filename

      【讨论】:

        【解决方案3】:

        如果不需要四舍五入,即需要将0.466028518635 打印为0.46,请使用:

        cat <input> | awk -F, '{$5=sprintf( "%.4s", $5)} 1' OFS=,
        

        (这可以是Useless use of cat的另一个例子)

        【讨论】:

        • 我不知道四舍五入,感谢您的时间和帮助!
        【解决方案4】:

        你想要它在 perl 中,就是这样:

        perl -F, -lane '$F[4]=~s/^(\d+\...).*/$1/g;print join ",",@F' your_file
        

        测试如下:

        > cat temp
        16:47:07,3,r-4-VM,230000000.,0.466028518635,131072,0,0,0,60,0
        16:47:11,3,r-4-VM,250000000.,10.50822578824,131072,0,0,0,0,0
        16:47:14,3,r-4-VM,240000000.,0.488406067907,131072,0,0,32768,0,0
        16:47:17,3,r-4-VM,230000000.,0.467893525702,131072,0,0,0,0,0
        > perl -F, -lane '$F[4]=~s/^(\d+\...).*/$1/g;print join ",",@F' temp
        16:47:07,3,r-4-VM,230000000.,0.46,131072,0,0,0,60,0
        16:47:11,3,r-4-VM,250000000.,10.50,131072,0,0,0,0,0
        16:47:14,3,r-4-VM,240000000.,0.48,131072,0,0,32768,0,0
        16:47:17,3,r-4-VM,230000000.,0.46,131072,0,0,0,0,0
        

        【讨论】:

        • 在 Perl 中!太好了!,非常感谢!为了您的时间和精力!
        【解决方案5】:
        sed -r 's/^(([^,]+,){4}[^,]{4})[^,]*/\1/' file.csv
        

        【讨论】:

          【解决方案6】:

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

          sed -r 's/([^,]{,4})[^,]*/\1/5' file
          

          这会将第 5 次出现的非逗号替换为不超过 4 个字符的长度。

          【讨论】:

            猜你喜欢
            • 2021-05-03
            • 2012-04-17
            • 1970-01-01
            • 2015-03-19
            • 1970-01-01
            • 1970-01-01
            • 2021-05-24
            • 1970-01-01
            相关资源
            最近更新 更多