CSVファイルの5番目のフィールドが空かどうかを確認する必要があります。これは私のファイルです:
1,abc,543,87,DATA,fsg;
1,abc,543,87,,fsg;
1,abc,543,87,DATA,fsg;
1,abc,543,88,,fsg;
1,abc,543,,DATA,fsg;
ご覧のとおり、2行目と4行目には5番目のフィールドが空になっています。これらすべての行を印刷したい。
結果は次のようになります:
1,abc,543,87,,fsg;
1,abc,543,87,,fsg;
別のawk
:
$ awk -F, '!length($5)' file
1,abc,543,87,,fsg;
1,abc,543,88,,fsg;
-F
オプションで別のフィールドセパレーター(デフォルトではスペース)を使用でき、5番目の列が空かどうかを確認するだけで済みます。
awk -F',' '{if($5==""){print $0}' myfile
より簡潔に:
awk -F, '$5==""' myfile
-
そしてsedコマンドで:
sed -n '/,,[^,]*$/p' myfile
(-n
)が/,,[^,]*$/
で終わり、つまり...$
(5番目のフィールドが空)+を含まない6番目のフィールドである場合を除いて、(,,
)を印刷しません。 a ,
([^,]
=コンマを除くすべて)。
6つを超えるフィールドがある場合、コマンドは期待どおりに機能しないことに注意してください。
単純なawk
で十分です:
awk -F, '$5==""' your_file
説明
,
(-F ,
)に設定されていますawk
のデフォルトのアクションは、現在のレコードを印刷することです。これは、5番目のフィールドが空白の場合にのみ発生するようにします($5 == ""
)grep
を使用(要求されたとおり):
grep -e '.*,.*,.*,.*,,' input
これは、5番目以降に空のフィールドがある行に一致しますが
awk
コマンドを使用できます。
$ awk '/^(.*,){4},.*/' filename
1,abc,543,87,,fsg;
1,abc,543,88,,fsg;
,
が4回続く任意の文字の正規表現テスト。その後、次の文字は別の,
(5番目の空白フィールド)の後に何でも続く必要があります。
Pythonicソリューション:
python3 -c 'import sys, csv; csv.writer(sys.stdout).writerows(filter(lambda record: record[4] == "", csv.reader(sys.stdin)))' < input.csv
csv
モジュールを使用して、stdin
を解析し、5番目の要素が空の行をすべてフィルター処理します(0からインデックスするため、インデックス4)。csv
モジュールを使用してstdout
に書き出されました。sed
多分:
sed -n 's/,/,\n/4;s/\n,/,/p'
あるいは:
sed -n '/^\([^,]*,\)\{4\},/p'
上記はすべてのgrep
でも機能するはずです。/
文字の前後のビットは省略してください。一部のsed
sでは、最初のs///
ubstitutionでn
の代わりにリテラルの改行が必要になる場合があります。
また、ファイルのリスト(BULK OF FILE)の5番目の列のnull値を見つけ、そのファイル名でレコードを印刷することもできます。
awk -F',' '$5 == "" {printf FILENAME"="$0"\n"}' *common_filepattern*
説明:
-F,
フィールド制限をに設定、$5 ==""
は列5からnullですFILENAME
=ファイル名は、ファイルの名前を出力するためのキーワードです