代わりに使用できる場合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_fileawk:スクリプトへの入力ファイルとして「in_file」を指定します
- 必要に応じて、上記のスクリプトの最後に追加
> out_fileして、出力を代わりにファイルにリダイレクトしますstdout
または、よりクリーンで堅牢なソリューションについては、Edの回答を参照してください。