AWKコマンドパラメータエラー

AWKコマンドパラメータエラー

学生の連絡先情報を含むデータセットがあります。サンプルデータセットは次のとおりです。

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

  1. 堅牢性のために絶対にこれを行うのではなく、printf $0常にprintf "%s", $0その逆を使用してください。入力にフォーマット文字が含まれていると、前者は失敗しますprintf(現在見ているように)、printfすべての入力データを使用しても同じことが当てはまります。
  2. RFS明確さと堅牢性のために、たとえば、組み込み変数名との競合を避け、組み込み変数を使用しないときに組み込み変数を使用するように見せることで、コードの混乱を避けるために変数名全体を大文字にしないでください。
  3. 読みやすくするために、スクリプトの後に変数を設定しないでくださいRS。他の入力ファイルに異なる値を設定する必要がない場合は、スクリプトの前または先頭に変数を設定して、スクリプトの実行時に表示できるようにしてください。スクリプトが読み込まれました。スクリプトが使用されるのを見る前に設定されます。
  4. 効率性、単純性、および堅牢性のために、* sub()の最初のパラメータは文字列ではなく正規表現なので、指定しない限り、文字列(/.../)区切り文字の代わりに正規表現("...")を使用してください。何らかの理由で静的正規表現ではなく、動的に必要です。
  5. 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を効率的に解析する最も強力な方法は何ですか

答え2

RFS発生するエラーは、(空の変数)値を使用し、$0フォーマット文字列としてAND接続を使用するために発生しますprintf

ファイルは有効なCSVファイルです。ただし、一部の区切り文字のコンマの後にスペースがあります(これにより、フィールドの引用符が混乱しますAddress。引用符付きフィールドには、区切り文字の直後に最初の引用符を含める必要があります)。csvformat(csvkitの一部)を使用してこれを変更できます。https://csvkit.readthedocs.io/en/latest/):

$ csvformat --skipinitialspace file.csv >fixed-file.csv
$ cat fixed-file.csv
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

CSVを解析できるデータベースは、そのまま読める必要があります。

含まれているすべてのカンマをに置き換えますか|?ファイル区切り文字をコンマ以外のものに変更し(下のタブを使用します)、残りのコンマをすべてパイプに変更してからもう一度変更します。カンマを区切り文字として使用します。

生データから直接これを行うことができます。

$ csvformat --skipinitialspace --out-tabs file.csv | tr ',' '|' | csvformat --tabs >fixed-file.csv
$ cat fixed-file.csv
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

使用される長いオプションのさまざまな短いバリエーションは、-Sfor --skipinitialspace-Tfor 、--out-tabsおよび-tforです--tabs

関連情報