awk를 사용하여 CSV 파일에서 두 번째 및 세 번째 열을 추출하는 방법은 무엇입니까?

awk를 사용하여 CSV 파일에서 두 번째 및 세 번째 열을 추출하는 방법은 무엇입니까?

나는 배쉬를 사용하고 있습니다. 아래와 같은 항목이 포함된 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

이 경우 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에서 사용합니다. 나는 이것이 더 사용자 친화적이라고 믿습니다.

관련 정보