删除';'在每一行的末尾

时间:2011-03-03 17:09:59

标签: linux unix sed

我在Linux服务器上有一个巨大的(10+ GB).csv文件。这些线看起来像这样:

6;20000327;20000425;990099,0;20000327;LL;UBXO;7;-1;62;F;30;001;NO;NO;wgB;0;99;0002;5530;001;708;196;1;AA;N;N;100;53,81;0;0;0;1;1;;1;
6;20000327;20000425;990099,0;20000425;LL;OLD*;62;62;92;F;30;001;NO;NO;ueB;0;99;0002;XXXX;001;;;1;AA;N;N;;;0;0;1;0;0;;30;

我正在搜索快速脚本来执行以下操作:

  1. <number>,<number>的所有出现更改为<number>.<number>
  2. 删除每行的最后一个分号
  3. 我对第二个问题特别有问题,因为脚本不应该介意它是Linux文件还是Windows文件。

    我尝试用sed做到但到目前为止失败了。

    [编辑]

    我最终使用了Dennis Williams和SiegeX解决方案的混合物:

    sed 's/;\([0-9]*\),\([0-9]*\);/;\1.\2;/g;s/;\(\r\?\)$/\1/' inputfile
    

    (带有s /; [[:blank:]] * $ //的部分在我的文件中无效...)

4 个答案:

答案 0 :(得分:3)

sed 's/;\([0-9]*\),\([0-9]*\);/;\1.\2;/g;s/;[[:blank:]]*$//' ./infile

答案 1 :(得分:3)

$ cat file
6;20000327;20000425;990099,0;20000327;LL;UBXO;7;-1;62;F;30;001;NO;NO;wgB;0;99;0002;5530;001;708;196;1;AA;N;N;100;53,81;0;0;0;1;1;;1;
6;20000327;20000425;990099,0;20000425;LL;OLD*;62;62;92;F;30;001;NO;NO;ueB;0;99;0002;XXXX;001;;;1;AA;N;N;;;0;0;1;0;0;;30;

$ perl -p -e 's/(\d+),(\d+)/\1.\2/g; s/;$//' file
6;20000327;20000425;990099.0;20000327;LL;UBXO;7;-1;62;F;30;001;NO;NO;wgB;0;99;0002;5530;001;708;196;1;AA;N;N;100;53.81;0;0;0;1;1;;1
6;20000327;20000425;990099.0;20000425;LL;OLD*;62;62;92;F;30;001;NO;NO;ueB;0;99;0002;XXXX;001;;;1;AA;N;N;;;0;0;1;0;0;;30

注意:perl会为您处理不同的行结尾。

答案 2 :(得分:2)

尝试一下:

sed 's/,/./g;s/;\r\?$//' inputfile

如果在那里保留回车:

sed 's/,/./g;s/;\(\r\?\)$/\1/' inputfile

答案 3 :(得分:1)

如果您使用perl很方便,那么您可以使用perl one liner来执行这些操作。以下是您可以进行数字更改的示例:

 perl -i -pe 's/(\d),(\d)/$1\.$2/' yourfile

要非常小心-i选项,因为它会导致perl对现有文件进行操作。