awk 명령에 오류가 발생했습니다

awk 명령에 오류가 발생했습니다

입력하다:

123456.00|aswani|india|ap
23456.00|rani|us|tel
233|ramu|londan|vih

산출:

aswani|ap
rani|tel
ramu|vih

다음 명령을 사용하여 이 출력을 얻으려고 합니다.

awk '{FS="|";OFS="|"}{print $2,$4}'

그러나 내가 얻는 결과는 다음과 같습니다.

|
rani|tel
ramu|vih

명령은 라인 2에서 실행되지만 라인 1에서는 실행되지 않습니다. 첫 번째 줄과 함께 출력하려고합니다.

답변1

"BEGIN" 블록 안에 첫 번째 블록(FS 및 OFS 설정)을 넣어야 합니다.

awk 'BEGIN {FS="|";OFS="|"} {print $2,$4}'

"BEGIN" 블록을 실행합니다앞으로텍스트의 첫 번째 줄이 처리되었습니다. 대신에 실행될 별도의 블록이 있습니다.모든하지만 첫 번째 줄의 경우 필드가 이미 분할되었기 때문에 FS 설정이 너무 늦게 발생합니다.

또 다른 방법은 awk 명령줄 옵션을 통해 FS를 설정하는 것이지만 여전히 OFS를 처리해야 합니다.

awk -F '|' '{OFS="|"; print $2,$4}'

또는:

awk -F '|' -v OFS='|' '{print $2,$4}'

고쳐 쓰다:@Kusalananda가 지적했듯이 awk일부 구현(예: BSD awk)은 FS가 재설정되면 필드를 다시 분할하므로 "BEGIN" 블록에 설정할 필요가 없습니다. GNU awk(일반적으로 Linux 배포판에 있는 것)에서는 이런 일이 발생하지 않으므로 줄을 분할하기 전에 FS를 설정해야 합니다.

답변2

~처럼필 브랜든이 지적했다.GNU awk(및 )를 올바르게 설정 mawk해야 합니다.FS앞으로첫 번째 줄을 읽습니다. 그렇지 않으면 기본 필드 구분 기호(일련의 공백)에 따라 줄이 분할됩니다. 당신의 코드 세트FS 뒤쪽에각 라인을 읽어오기 때문에 파일의 첫 번째 라인을 처리할 때 잘못된 값이 발생하게 됩니다.

OpenBSD는 awk(적어도) 다르게 동작하며 필드에 액세스할 때 현재 레코드를 분할하는 것처럼 보이지만 이전에는 그렇지 않습니다. 이는 귀하의 코드가 실제로 OpenBSD 시스템에서 실행될 수 있음을 의미합니다.

추가 처리 없이 파일에서 열 집합을 추출하기 위해 이 명령을 추가하겠습니다. 이 cut명령도 유용합니다.

$ cut -d '|' -f 2,4 <file
aswani|ap
rani|tel
ramu|vih

관련 정보