2

このような大きな.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か?

4

3 に答える 3

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_fileawk:スクリプトへの入力ファイルとして「in_file」を指定します
  • 必要に応じて、上記のスクリプトの最後に追加> out_fileして、出力を代わりにファイルにリダイレクトしますstdout

または、よりクリーンで堅牢なソリューションについては、Edの回答を参照してください。

于 2012-11-21T17:26:00.687 に答える
3

sedでそれを行うこともできますが、awkを使用すると簡単になります。

awk 'BEGIN{FS=OFS=";"} $5!~/^[0-9]$/{$5=""} 1' file
于 2012-11-21T17:37:08.463 に答える
2

これはあなたのために働くかもしれません(GNU sed):

sed -r 's/^(([^;]*;){4})[^;0-9]+/\1/' file
于 2012-11-21T22:08:31.947 に答える