以下のように空でない2つのフィールドのみを含める必要がある単純なcsvファイルがあります。
以下は正しいcsvファイルの例です。
$ more file.csv
why_we_need_help,log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,log_low=53687091200
.
.
.
目標は、csvファイルに空でないフィールドが2つだけ含まれていることを確認することです。
ファイルにフィールドが2つしかないことを確認するには、次のawkで始めます。
awk 'BEGIN{FS=OFS=","} NF!=2{print "not enough fields" }' file.csv
ただし、以下の例では、「フィールドが不足しています」を提供していないため、機能しません。
why_we_need_help,log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,
その他のエラーcsvファイルの例:
why_we_need_help,,log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200,
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,log_low=53687091200,
または
why_we_need_help log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,,
答え1
もう一つのawkオプションは
awk 'BEGIN{FS=OFS=","}NF!=2||$1==""||$2==""{print "Not enough fields";exit 5}' file.csv
2 つのフィールドのいずれかが空であることを明示的に確認します。その場合は、メッセージを印刷してエラーコード5ですぐに終了します(数字はランダムです。お気に入りのものを選択してください)。
答え2
この試み:
awk 'BEGIN{FS=OFS=","} f{skip} NF!=2||!length($1)||!length($2){f=1} END{if (f) {print "File contains malformed lines"; exit 1}}' file.csv
f
ファイルに2つの,
区切りフィールドが含まれていない場合、または2つの必須フィールドが空の場合は常にフラグが設定されます。最後に、ファイルの解析中にフラグがセットされると、メッセージを出力し、要求に応じてエラーコード1で終了します。
フラグがすでに設定されている場合、最初のルールはプロセスを高速化するためにライン解析をスキップします。なぜなら、間違った行があるのか知りたいからです。したがって、そのような行が見つかると、ファイルが間違っていることがわかります。ファイルの残りの部分を考慮する必要があります。
間違った形式の行数を知りたい場合は、次の小さな変更を使用して印刷できます。
awk 'BEGIN{FS=OFS=","} NF!=2||!length($1)||!length($2){f++} END{if (f) {printf("File contains %d malformed line(s)\n",f); exit 1}}' file.csv
答え3
よくわかりませんが、あなたが探しているものは次のとおりです。
awk -F',' 'NF!=2 || /^,|,$/{print "bad:", NR | "cat>&2"; exit 1}' file
その行の特定のエラーを報告するように改善することができます。
awk -F',' '
NF<2 { err="too few fields" }
NF>2 { err="too many fields" }
/^,|,$/ { err=(err == "" ? "" : err " and ") "empty fields" }
err != "" { print err, "at line", NR | "cat>&2"; exit 1 }
' file
または、すべての行のすべてのエラーを一度に見つけるには、次の手順を実行します。
awk -F',' '
NF<2 { err="too few fields" }
NF>2 { err="too many fields" }
/^,|,$/ { err=(err == "" ? "" : err " and ") "empty fields" }
err != "" { print err, "at line", NR | "cat>&2"; err=""; f=1 }
END { exit f }
' file
答え4
入力ファイル
cat op.txt
why_we_need_help,log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,log_low=53687091200
look_on_the_room,
,ajay
awkコマンド
awk -F "," 'NF == "2" {print $0}' filename | sed "s/,/ /g"| sed -n '/\s\{2,\}/!p'| awk '{gsub(" ",",",$0);print}'
出力
why_we_need_help,log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,log_low=53687091200
Python
#!/usr/bin/python
import re
u=re.compile(r' {2,}')
k=open('filename','r')
for i in k:
q=re.sub(","," ",i)
if not re.search (u,q):
print q.replace(" ",",").strip()
出力
why_we_need_help,log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,log_low=53687091200