특정 열 찾기 및 바꾸기

특정 열 찾기 및 바꾸기

sed나는 내 Unix(Solaris)에서 이것이 작동하지 않는 이유를 모르기 때문에 특정 열 찾기 및 바꾸기를 사용하는 것을 좋아하며 awk gsub()이것이 바로 내가 사용하고 싶은 것입니다 sed.

견본:

122|abc|ds,we||wrqg
145|dw|ett,335||nxd
166|rotl|qqqp,eoepepe||ge
776|gge|022||pp
039|pot|011a||lot

세 번째 열에서는 파이프( ) ,의 쉼표( )를 바꾸고 싶습니다 .|

을(를 ) 사용하려고 하면 gsub()다음 오류가 발생합니다.

awk '{gsub(",","|",$3)}1' in.file > out.file

awk: syntax error near line 1
awk: illegal statement near line 1
awk: syntax error near line 1
awk: bailing out near line 1

또한 이를 내 데이터베이스(Oracle)로 가져옵니다. ,데이터를 로 바꾸면 변경된 |데이터 레코드가 동일한 필드에 존재하지 않습니다. 어떻게 하나요?

출력은 다음과 같습니다.

122|abc|ds|we|wrqg
145|dw|ett|335|nxd
166|rotl|qqqp|eoepepe|ge
776|gge|022||pp
039|pot|011a||lot

누구든지 이건 정말 필요해요.

답변1

Solaris /usr/bin/awk의 다양한 기능에 대한 지원은 심각하게 제한됩니다. 특히 이 gsub()기능은 구현되지 않았습니다. 이에 대한 설명은 다음과 같습니다.awkSolaris 설명서.

/usr/xpg4/bin/awk이를 위해서는 (또는 nawk"new awk")를 사용해야 합니다 .

또한 코드는 필드 구분 기호를 지정하지 않으므로 awk실수 $3로 공백으로 구분된 세 번째 필드를 생성할 만큼 데이터에 공백이 충분하지 않은 한 아무 것도 포함되지 않습니다. 마찬가지로 출력 필드 구분 기호를 지정하지 않으므로 수정된 행의 필드는 공백으로 구분됩니다.

대신에:

/usr/xpg4/bin/awk -F '|' 'BEGIN { OFS=FS } { gsub(",", "|", $3); print }' file

이를 Solaris에서 항상 기본값으로 만들려면 쉘의 시작 파일에서 이를 /usr/xpg4/bin/awk사용하십시오 .awkPATH="$(/usr/xpg4/bin/getconf PATH):$PATH"

관련 정보