CSV 파일 열의 문자열을 작은따옴표가 있는 다른 문자열로 바꿉니다.

CSV 파일 열의 문자열을 작은따옴표가 있는 다른 문자열로 바꿉니다.

특정 문자열을 찾아 awk를 사용하여 .CSV 파일의 세 번째 열 내용을 바꾸고 이를 작은따옴표가 있는 다른 문자열로 바꾸고 해당 출력을 다른 파일에 복사하고 싶습니다. 내가 뭘 잘못하고 있는지에 대한 제안이 있습니까?

예를 들어:

column1, coluumn2, coulumn3, column4, column5
1, item1, WALMART, 2.39, 50
2, item2, TARGET, 4.99, 52
3, item3, SAMS CLUB, 8.19, 15
4, item4, KROGER, 12.49, 33
5, item6, WEGMANS, 32.69, 75
6, item6, TARGET, 12.99, 25
7, item7, SAMS CLUB, 8.19, 92

아래에서 awk를 사용해 보았지만 작동하지 않습니다.

awk '{gsub("SAMS CLUB","SAM\'S CLUB",$3);print}' filename1 > filename2

답변1

FS필드 구분 기호( )를 올바르게 설정 해야 합니다 . 기본적으로 awk수평 공백은 필드 구분 기호로 사용되므로 귀하의 경우에는 SAMS하나의 필드와 다른 필드가 됩니다 CLUB. 따라서 {gsub("SAMS CLUB","SAM\'S CLUB",$3);print}예상대로 작동하지 않습니다.

넌 할 수있어:

awk -F ', +' '{gsub("SAMS CLUB","SAM'\''S CLUB",$3); print}' OFS=", " file.txt
  • -F ', +'쉼표로 설정하고 FS그 뒤에 하나 이상의 공백이 옵니다. 공백에 대해 잘 모르는 경우 문자 클래스를 사용하여 [:blank:]가로 공백을 나타내고 OFS필요에 맞게 변경하세요.

예:

% cat file.txt                                                                      
column1, coluumn2, coulumn3, column4, column5
1, item1, WALMART, 2.39, 50
2, item2, TARGET, 4.99, 52
3, item3, SAMS CLUB, 8.19, 15
4, item4, KROGER, 12.49, 33
5, item6, WEGMANS, 32.69, 75
6, item6, TARGET, 12.99, 25
7, item7, SAMS CLUB, 8.19, 92

% awk -F ',[[:blank:]]+' '{gsub("SAMS CLUB","SAM'\''S CLUB",$3); print}' OFS=", " file.txt
column1, coluumn2, coulumn3, column4, column5
1, item1, WALMART, 2.39, 50
2, item2, TARGET, 4.99, 52
3, item3, SAM'S CLUB, 8.19, 15
4, item4, KROGER, 12.49, 33
5, item6, WEGMANS, 32.69, 75
6, item6, TARGET, 12.99, 25
7, item7, SAM'S CLUB, 8.19, 92

답변2

awk -F, '{gsub("SAMS CLUB","SAM'\''S CLUB",$3);print}' filename1 > filename2

꽤 가까워졌습니다. 두 부분이 누락되었습니다.

  1. 입력을 -F,쉼표( )를 기준으로 필드 로 분할하도록 awk에 지시하고
  2. 대체 텍스트에 작은따옴표 넣기

awk 스크립트는 작은따옴표로 둘러싸여 있으므로 한 가지 접근 방식은 작은따옴표 텍스트를 끝내고 (이스케이프 처리된) 작은따옴표를 삽입한 다음 작은따옴표 텍스트를 복원하는 것입니다. 또 다른 방법은 변수를 사용하는 것입니다.

awk -F, -v old="SAMS CLUB" -v new="SAM'S CLUB" '{gsub(old,new,$3);print}' filename1 > filename2

또 다른 방법은 배열 변수를 사용하는 것입니다 ENVIRON.

old="SAMS CLUB"
new="SAM'S CLUB"
export old new
awk -F, '{gsub(ENVIRON["old"], ENVIRON["new"], $3);print}'  

또 다른 방법은 awk 스크립트를 파일에 저장하고 다음을 사용하여 호출하는 것입니다.

awk -F, -f awk-script-filename filename1 > filename2

스크립트 파일을 사용하면 인용을 단순화할 수 있습니다.

{gsub("SAMS CLUB","SAM'S CLUB",$3);print}

답변3

또 다른 짧은 이야기해결책:

awk -F, '$3~"SAMS CLUB"{sub("S ","\047S ",$3)}1' OFS=',' filename1 > filename2

관련 정보