a.csv
、b.csv
およびという3つのファイルがありますc.csv
。
a.csv
内容があります
1234567,11111111111111111111111111111111111111111111111111
b.csv
同様の内容があります。
1234567845610111211111111111111111111111111
c.csv
内容があります
111111,22222222,3333333,,,44444444444444444444
上記のa.csv
3つのファイルのうち、2つの列を持つファイルにはnull値を含めないでください。残りのファイル(および)は、ファイルを含むb.csv
他のテキストファイルc.csv
の例にロードする必要があるという意味でのみ必要です。List.txt
b.csv
c.csv
,
コンマ()なしでファイルを削除するために次のコマンドを試しましたが、うまくいかないこともb.csv
考慮する必要があります。c.csv
grep -v "," *.csv |cut -d ":" -f1
提案したように、次のコマンドを試しましたが、2つの値列を持つファイルが表示されます。
awk -F"," 'NF==2 {print FILENAME}' *.csv
ただし、無効なファイルを別のファイルに書き込む必要がある場合は、いくつかの提案を教えてください。
提案どおりに次のことを試しましたが、成功しませんでした。
ls | grep -v $(awk -F"," 'NF==2 {print FILENAME}') *.csv|sort -u
私も一度やってみるように勧めました。
awk -F',' 'BEGINFILE{ok=1}!$1||!$2||NF!=2{ok=0; nextfile}ENDFILE{if(!ok)print FILENAME}' *.csv
ただし、これにより次のエラーが発生します。
awk: A statement occurred that is not valid.
The input line number is 1. The file is <Filename>
The source line number is 1.
2番目のフィールド値は長さが250文字でa.csv
、b.csv
...などのn個の値があります。
ベストアンサー1
私が正しく理解したら、次のいずれかの条件で満足する行を含むファイルを削除したいと思います。
- フィールド 1 は空です。
!$1
- フィールド 2 は空です。
!$2
- 2つのフィールドはありません。
NF!=2
それから
awk -F',' 'BEGINFILE{ok=1}!$1||!$2||NF!=2{ok=0; nextfile}ENDFILE{if (ok) print FILENAME}' *.csv
ok=1
フラグを設定し、上記のいずれかの条件が満たされるまで各行を繰り返し、「間違った」行が見つかった場合はファイルを無効にし、行を解析せずにファイルの末尾ok=0
にジャンプしますnextfile
。
各ファイルの終わりにゼロ以外の場合にのみENDFILE
印刷されます。FILENAME
if (ok)
したがって、一致を無効にするには、最後のテストを反転してif (!ok)
印刷するだけです。
awk -F',' 'BEGINFILE{ok=1}!$1||!$2||NF!=2{ok=0; nextfile}ENDFILE{if (!ok) print FILENAME}' *.csv
編集する
出力でエラーを再現することはできませんgawk
(ファイル名をxxx.fileにリダイレクトするなど、以下を参照)。
bash --version
GNU bash, version 5.0.16(1)-release (x86_64-pc-linux-gnu)
awk --version
GNU Awk 5.1.0, API: 3.0 (GNU MPFR 4.0.2, GNU MP 6.2.0)
tail -n +1 *.csv;
awk -F',' 'BEGINFILE{ok=1}
!$1||!$2||NF!=2{ok=0; nextfile}
ENDFILE{gzout=(ok)?"ok":"banjaxed"; print FILENAME > gzout".files"}' *.csv ;
tail -n +1 *.files
==> a.csv <==
1234567,11111111111111111111111111111111111111111111111111
==> b.csv <==
1234567845610111211111111111111111111111111
==> c.csv <==
111111,22222222,3333333,,,44444444444444444444
==> banjaxed.files <==
b.csv
c.csv
==> ok.files <==
a.csv
単一フィールド長制限(1024)問題にならないでくださいawk
3,000文字のレコード制限に違反しない限り、この場合、awk
どちらもsed
操作に適したツールではないようです。