如何使用 awk 从 CSV 文件中提取第二列和第三列?

如何使用 awk 从 CSV 文件中提取第二列和第三列?

我正在使用 bash。我有一个 CSV 文件,其中的条目如下所示

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

我想提取第二列和第三列并将它们放入 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 文件中提取第二列和第三列的正确语法是什么?

编辑:这就是针对给出的答案所发生的事情......

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

此外,如果输入文件的格式一致(三个字段,您得到第一个和第二个),您可以使用$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 按原样放置在空白中,因为它们不是像 * 那样的 shell 元字符? $ [ 或者我们必须转义它们或将它们放置在非空白区域,例如 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 中使用它们。我相信这对用户来说更加友好。

相关内容