从csv文件中的整数字段中删除文本

时间:2012-11-21 17:20:26

标签: regex text csv sed integer

我有一个看起来像这样的大型.csv文件

19186;1964;F;001;;;;19000101;21000101;20110630
19187;1972;M;001;MMag. Dr.;;;19000101;21000101;20110630
19190;1936;F;999;3;;;19000101;21000101;20110630

每次第5个值不是整数<10 (不是0-9)时,都应将其删除。所以结果应该是这样的

19186;1964;F;001;;;;19000101;21000101;20110630
19187;1972;M;001;;;;19000101;21000101;20110630
19190;1936;F;999;3;;;19000101;21000101;20110630

如何使用sed完成此操作?

3 个答案:

答案 0 :(得分:3)

如果您可以使用awk,那么我认为这比sed解决方案更清晰:

#!/bin/bash

awk 'BEGIN{FS=OFS=";"}
     {if (($5 >= 10) || ($5 < 0) || ($5 % 1 != 0)) {$5=""} print}' in_file

输入:

19186;1964;F;001;;;;19000101;21000101;20110630
19187;1972;M;001;MMag. Dr.;;;19000101;21000101;20110630
19190;1936;F;999;3;;;19000101;21000101;20110630
19190;1936;F;999;-3;;;19000101;21000101;20110630
19190;1936;F;999;3.5;;;19000101;21000101;20110630
19190;1936;F;999;10;;;19000101;21000101;20110630

输出:

19186;1964;F;001;;;;19000101;21000101;20110630
19187;1972;M;001;;;;19000101;21000101;20110630
19190;1936;F;999;3;;;19000101;21000101;20110630
19190;1936;F;999;;;;19000101;21000101;20110630
19190;1936;F;999;;;;19000101;21000101;20110630
19190;1936;F;999;;;;19000101;21000101;20110630

<强>解释

  • awk:调用awk命令
  • '...':向单引号内的awk提供说明
  • BEGIN{FS=OFS=";"}:在阅读输入之前,告诉awk使用;作为输入和输出的分隔符​​(FS代表字段分隔符,OFS代表输出字段分隔符)
  • {if (($5 >= 10) || ($5 < 0) || ($5 % 1 != 0)) {$5=""}:如果第5个字段不在0-9之间,或者不是整数,请将该字段设置为空字符串。
  • print:打印(可能)已修改的行。
  • in_file:将“in_file”指定为awk脚本的输入文件
  • (可选)将> out_file添加到上述脚本的末尾,以将输出重定向到文件而不是stdout

另外:,适用于清洁工和更强大的解决方案,请参阅Ed的回答。

答案 1 :(得分:3)

你可以在sed中做到这一点但是用awk更简单:

awk 'BEGIN{FS=OFS=";"} $5!~/^[0-9]$/{$5=""} 1' file

答案 2 :(得分:2)

这可能适合你(GNU sed):

sed -r 's/^(([^;]*;){4})[^;0-9]+/\1/' file