입력하다:
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