代わりに使用できる場合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の回答を参照してください。