web-dev-qa-db-ja.com

CSVで5番目のフィールドが空白の行を印刷する方法

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; 
7
Abhishek dot py

別のawk

$ awk -F, '!length($5)' file
1,abc,543,87,,fsg; 
1,abc,543,88,,fsg;
12
cuonglm

-Fオプションで別のフィールドセパレーター(デフォルトではスペース)を使用でき、5番目の列が空かどうかを確認するだけで済みます。

awk -F',' '{if($5==""){print $0}' myfile

より簡潔に:

awk -F, '$5==""' myfile

-

そしてsedコマンドで:

sed -n '/,,[^,]*$/p' myfile

-n)が/,,[^,]*$/で終わり、つまり...$(5番目のフィールドが空)+を含まない6番目のフィールドである場合を除いて、(,,)を印刷しません。 a ,[^,] =コンマを除くすべて)。
6つを超えるフィールドがある場合、コマンドは期待どおりに機能しないことに注意してください。

7
fredtantini

単純なawkで十分です:

awk -F, '$5==""' your_file

説明

  • フィールド区切り文字は,-F ,)に設定されています
  • awkのデフォルトのアクションは、現在のレコードを印刷することです。これは、5番目のフィールドが空白の場合にのみ発生するようにします($5 == ""
3
Joseph R.

grepを使用(要求されたとおり):

grep -e '.*,.*,.*,.*,,' input 

これは、5番目以降に空のフィールドがある行に一致しますが

2
Anthon

awkコマンドを使用できます。

$ awk '/^(.*,){4},.*/' filename
1,abc,543,87,,fsg;
1,abc,543,88,,fsg;

,が4回続く任意の文字の正規表現テスト。その後、次の文字は別の,(5番目の空白フィールド)の後に何でも続く必要があります。

1
jherran

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に書き出されました。
1
muru

sed多分:

sed -n 's/,/,\n/4;s/\n,/,/p'

あるいは:

sed -n '/^\([^,]*,\)\{4\},/p'

上記はすべてのgrepでも機能するはずです。/文字の前後のビットは省略してください。一部のsedsでは、最初のs///ubstitutionでnの代わりにリテラルの改行が必要になる場合があります。

0
mikeserv

また、ファイルのリスト(BULK OF FILE)の5番目の列のnull値を見つけ、そのファイル名でレコードを印刷することもできます。

awk -F',' '$5 == "" {printf FILENAME"="$0"\n"}' *common_filepattern*  

説明:

  • -F,フィールド制限をに設定、
  • $5 ==""は列5からnullです
  • FILENAME =ファイル名は、ファイルの名前を出力するためのキーワードです
0