我正在使用 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 中使用它们。我相信这对用户来说更加友好。