특정 출력 필드 구분 기호를 사용하여 특정 열을 인쇄합니다.

특정 출력 필드 구분 기호를 사용하여 특정 열을 인쇄합니다.
cat A.tsv
1,a,d
2,b,e
3,c,f
$ awk -F ',' -v OFS="," '{print $2, $3}' A.tsv 
a,d
b,e
c,f
  • 다음 4개의 명령이 위와 동일한 결과를 제공할 것으로 예상했습니다.
$ awk 'FS=","; OFS=","; {print $2, $3}' A.tsv 
1,a,d
1,a,d
,
2,b,e
2,b,e
b,e
3,c,f
3,c,f
c,f
$ awk -F ',' 'OFS=","; {print $2, $3}' A.tsv 
1,a,d
a,d
2,b,e
b,e
3,c,f
c,f
$ awk -v OFS="," 'FS=","; {print $2, $3}' A.tsv 
1,a,d
,
2,b,e
b,e
3,c,f
c,f
$ awk -F ',' 'FS=OFS; {print $2, $3}' A.tsv 
1,a,d
a d
2,b,e
 
3,c,f

마지막 4개 명령의 결과가 첫 번째 명령과 다른 이유를 설명할 수 있는 사람이 있습니까?

인용하다:쉘 스크립트에서 awk -FS와 awk -f의 차이점

답변1

awk 프로그램은 TRUE로 평가될 경우 실행되는 pattern {action}쌍 으로 구성됩니다 . 생략 하면 기본값은 TRUE로 간주되고, 생략하면 기본 동작은 TRUE입니다 .{action}patternpattern{action}{print}

존재하다

awk 'FS=","; OFS=","; {print $2, $3}' A.tsv

당신은:

  1. FS=",",값으로 지정되고 FS부작용으로 TRUE로 평가되어 기본 작업을 트리거하는 패턴{print}

  2. 모드 OFS=","도 할당 ,되어 TRUE로 평가되고 두 ​​번째로 OFS기본 작업을 트리거합니다.{print}

  3. 작업에 대한 모드가 없으므로 {print $2,$3}기본값을 TRUE로 가정하고 작업이 트리거됩니다. 그러나 는 첫 번째 레코드가 처리될 때까지 설정되지 않으므로 FS및 둘 다 비어 있습니다(awk는 기본 공백을 사용하여 첫 번째 레코드를 구문 분석하고 전체 레코드를 할당하기 때문입니다). 후속 레코드에서는 예상되는 쉼표로 구분된 값을 인쇄합니다.,$2$3FS$1

아마도 레코드 처리가 시작되기 전에 작업에 합계를 FS=","할당 하려고 할 것입니다 OFS=",". 이것이 블록이 수행하는 작업입니다 BEGIN.

awk 'BEGIN{FS=","; OFS=","} {print $2, $3}' A.tsv

또는

awk -F ',' 'BEGIN{OFS=FS} {print $2, $3}' A.tsv

또는 파일 이름 인수 앞에 변수 할당을 인수로 전달할 수 있습니다. 이는 여러 파일로 작업하고 각 파일에 대해 서로 다른 필드 구분 기호를 설정하려는 경우 유용할 수 있습니다.

awk '{print $2, $3}' FS="," OFS="," A.tsv

관련 정보