学生の連絡先情報を含むデータセットがあります。サンプルデータセットは次のとおりです。
First Name, Last Name, Address, Phone Number
John, Doe, "House # 11, Street xyz, Road, Area",00000000
Sara, Taylor, "Jake Lake%, Apartment #22, Main Road, Area XYZ", 00000000
交換するために、次のコマンドを実行しています。、アドレスバーに|データベースにロードします。
awk '!(NR%2){gsub(",","|")} {printf RFS $0} {RFS="\""}' RS=\" fileName.txt > output.txt
私が直面した問題は、このコマンドを実行するたびに次のエラーが返されることです。最初は正常に動作しました。
awk: run time error: not enough arguments passed to printf(""Jake Lake%, Apartment #22, Main Road, Area XYZ")
解決策はありますか?私は気づいた%住所に表示される問題ですか?
ベストアンサー1
- 堅牢性のために絶対にこれを行うのではなく、
printf $0
常にprintf "%s", $0
その逆を使用してください。入力にフォーマット文字が含まれていると、前者は失敗しますprintf
(現在見ているように)、printf
すべての入力データを使用しても同じことが当てはまります。 RFS
明確さと堅牢性のために、たとえば、組み込み変数名との競合を避け、組み込み変数を使用しないときに組み込み変数を使用するように見せることで、コードの混乱を避けるために変数名全体を大文字にしないでください。- 読みやすくするために、スクリプトの後に変数を設定しないでください
RS
。他の入力ファイルに異なる値を設定する必要がない場合は、スクリプトの前または先頭に変数を設定して、スクリプトの実行時に表示できるようにしてください。スクリプトが読み込まれました。スクリプトが使用されるのを見る前に設定されます。 - 効率性、単純性、および堅牢性のために、* sub()の最初のパラメータは文字列ではなく正規表現なので、指定しない限り、文字列(
/.../
)区切り文字の代わりに正規表現("..."
)を使用してください。何らかの理由で静的正規表現ではなく、動的に必要です。 RS
明確さと保守を容易にするために、同じ値を持つ必要がある2つの変数がある場合は、同じ値にRFS
個別に設定したり、次のいずれかのようにそれらをRS="\""; RFS="\""
一緒に設定しないでください。RS=RFS="\""
一つ、例えばRS="\""; RFS=RS
。
質問にコードを正しく書き込む方法は次のとおりです。
$ awk -v RS='"' '!(NR%2){gsub(/,/,"|")} {printf "%s%s", rfs, $0; rfs=RS}' file
First Name, Last Name, Address, Phone Number
John, Doe, "House # 11| Street xyz| Road| Area",00000000
Sara, Taylor, "Jake Lake%| Apartment #22| Main Road| Area XYZ", 00000000
awk を使用して CSV でさらに作業を行うには、次を参照してください。awkを使用してcsvを効率的に解析する最も強力な方法は何ですか。