我有一个看起来像这样的大型.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
完成此操作?
答案 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