awkを使用してCSVファイルから2番目と3番目の列を抽出するには?

awkを使用してCSVファイルから2番目と3番目の列を抽出するには?

バッシュを使っています。以下の項目を含むCSVファイルがあります。

102110089,54d8f511cc595d120048984b,57cc73366e58b7cc330083a7
102110091,54d8f511cc595d120048984d,57cc73366e58b7cc330083a8
102110093,54d8f511cc595d120048984e,57cc73366e58b7cc330083a9

2番目と3番目の列を抽出してSQL文に入れたいです。この道は正しいと思いました...

localhost:myproject davea$ awk '{printf "update my_table_user set thirdparty_user_id='%s' where thirdparty_user_id='%s';", $(NF-2),$(NF-1)}' /tmp/Region1\ users.csv
awk: trying to access out of range field -1
 input record number 1, file /tmp/Region1 users.csv
 source line number 1

ところで、「範囲外のフィールドにアクセスしようとすると、-1」エラーが発生します。 CSVファイルから2番目と3番目の列を抽出する正しい構文は何ですか?

編集する:これは与えられた答えで起こったことです...

localhost:myproject davea$ awk -F\, '{printf "update my_table_user set thirdparty_user_id=\'%s\' where thirdparty_user_id=\'%s\'\;", $(NF-2),$(NF-1)}'
>

編集2更新された回答に応じて、私の結果は次のとおりです。 「更新」という単語が切り捨てられていることに注意してください。

localhost:myproject davea$ awk -F, '{printf "update my_table_user set thirdparty_user_id='\''%s'\'' where thirdparty_user_id='\''%s'\'';\n", $1,$3}' /tmp/myfile.csv
';date my_table_user set thirdparty_user_id='102110089' where thirdparty_user_id='57cc73366e58b7cc330083a7
';date my_table_user set thirdparty_user_id='102110091' where thirdparty_user_id='57cc73366e58b7cc330083a8
';date my_table_user set thirdparty_user_id='102110093' where thirdparty_user_id='57cc73366e58b7cc330083a9
';date my_table_user set thirdparty_user_id='102110107' where thirdparty_user_id='57cc73366e58b7cc330083b3

答え1

awk区切り文字が何であるかを知る必要があります,。したがって、次のようにコマンドを実行する必要があります。

awk -F\, '{printf "update my_table_user set thirdparty_user_id=\'%s\' where thirdparty_user_id=\'%s\'\;", $(NF-1),$(NF)}' /tmp/Region1\ users.csv

また、入力ファイルの形式が一貫している場合(3つのフィールド、最初と2番目のフィールドをインポート)、次のものを使用できます$1$2

答え2

この場合、二重の交差引用符があるので注意して進める必要があります。

        |-------------------------- 1 ------------------------|--2 --|------------- 3 ----------|--4 --|----- 5 ----|
awk -F, '{printf "update my_table_user set thirdparty_user_id='\'%s\'' where thirdparty_user_id='\'%s\'';\n", $2,$3}' yourcsvfile

領域2と4は、単一引用符と%s文字列を挿入する空の領域(引用符を除く)です。領域1、3、5はバランスの取れた一重引用符のペアです。領域1..5は連続的です。 %sは*のようなシェルメタ文字ではないので、スペースにそのまま配置できますか? $ [またはエスケープするか、3などのスペース以外のスペースに配置する必要があります。

別の方法は、awk変数を介して参照を提供することです。

awk -F, -v q=\' '{v2=q $2 q;v3=q $3 q;printf "update my_table_user set thirdparty_user_id=%s where thirdparty_user_id=%s;\n", v2,v3}' yourcsvfile

ここでは、最初に一重引用符で囲まれた変数を設定し、それをprintfで使用します。私はこれがよりユーザーフレンドリーであると信じています。

関連情報