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개 명령의 결과가 첫 번째 명령과 다른 이유를 설명할 수 있는 사람이 있습니까?
답변1
awk 프로그램은 TRUE로 평가될 경우 실행되는 pattern {action}
쌍 으로 구성됩니다 . 생략 하면 기본값은 TRUE로 간주되고, 생략하면 기본 동작은 TRUE입니다 .{action}
pattern
pattern
{action}
{print}
존재하다
awk 'FS=","; OFS=","; {print $2, $3}' A.tsv
당신은:
FS=","
,
값으로 지정되고FS
부작용으로 TRUE로 평가되어 기본 작업을 트리거하는 패턴{print}
모드
OFS=","
도 할당,
되어 TRUE로 평가되고 두 번째로OFS
기본 작업을 트리거합니다.{print}
작업에 대한 모드가 없으므로
{print $2,$3}
기본값을 TRUE로 가정하고 작업이 트리거됩니다. 그러나 는 첫 번째 레코드가 처리될 때까지 설정되지 않으므로FS
및 둘 다 비어 있습니다(awk는 기본 공백을 사용하여 첫 번째 레코드를 구문 분석하고 전체 레코드를 할당하기 때문입니다). 후속 레코드에서는 예상되는 쉼표로 구분된 값을 인쇄합니다.,
$2
$3
FS
$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