如果您可以改用,我认为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
awk
:指定“in_file”作为脚本的输入文件
- (可选)添加
> out_file
到上述脚本的末尾以将输出重定向到文件而不是stdout
或者:对于更清洁和更强大的解决方案,请参阅 Ed 的回答。