Como eu extraio as segunda e terceira colunas do meu arquivo CSV com o awk?

0

Estou usando o bash. Eu tenho um arquivo CSV com entradas semelhantes a esta

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

Eu quero extrair as segunda e terceira colunas e colocá-las em uma instrução SQL. Eu pensei que este era o caminho a percorrer ...

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

mas estou recebendo este erro "tentando acessar fora do intervalo campo -1". Qual é a sintaxe apropriada para extrair as segunda e terceira colunas do meu arquivo CSV?

Editar: Isto é o que é feliz em resposta à resposta dada ...

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

Editar 2 Em resposta à resposta atualizada, aqui está minha saída. Observe que a palavra "atualização" está sendo cortada ...

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
    
por Dave 30.06.2017 / 15:30

2 respostas

2

O awk precisa saber que o delimitador é , . Então você deve executar o comando dessa maneira:

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

Além disso, se o formato do arquivo de entrada for consistente (três campos, você obtém o primeiro e o segundo), é possível usar $1 e $2

    
por 30.06.2017 / 15:48
1

Você precisa seguir com cuidado neste caso, já que tem duas camadas de citações de intercalação:

        |-------------------------- 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

Observe que as regiões 2 e 4 são espaços em branco (sem aspas) e lá inserimos nossas aspas simples e as sequências% s. As regiões 1,3,5 são pares simples cotados equilibrados. As regiões 1..5 são contíguas. Somos capazes de colocar% s no espaço em branco, pois eles não são metacaracteres do shell como *? $ [ou teríamos que escapar deles ou colocá-los em regiões não brancas como 3.

Outra forma é a via disponibilizar uma cotação por meio de uma variável 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

Neste, primeiro construímos as variáveis delimitadas com aspas simples e elas as utilizam em nosso printf. Eu acredito que isso é mais fácil de usar.

    
por 30.06.2017 / 17:55