헤더 이름으로 awk로 열 인쇄


12

나는 텍스트 파일을 가지고있다.

foo bar baz
1   a   alpha
2   b   beta
3   c   gamma

awk를 사용하여 1 및 3과 같은 특정 열을 인쇄 할 수 {print $1, $3}있지만 대신 열 머리글을 지정하여 인쇄 할 열을 지정하려고합니다 {print $foo, $baz}. 이 기능은 파일을 열고 열을 수동으로 계산하여 열이 어느 열인지 확인하지 않아도되므로 열 번호 나 순서가 변경되는 경우 스크립트를 업데이트 할 필요가 없습니다. awk (또는 다른 쉘 도구)로 이것을 할 수 있습니까?

답변:


17
awk '
NR==1 {
    for (i=1; i<=NF; i++) {
        f[$i] = i
    }
}
{ print $(f["foo"]), $(f["baz"]) }
' file
foo baz
1 alpha
2 beta
3 gamma

그것은 엄청나게 유용한 관용구입니다. 스프레드 시트에 많은 데이터가 있으며 다른 스프레드 시트에는 관심이있는 열의 공통 하위 집합이있을 수 있지만 모든 스프레드 시트에서 동일한 순서로 또는 다른 열의 앞 / 뒤에 동일한 수의 열이 있어야 할 필요는 없습니다. CSV 또는 이와 유사한 형식으로 만든 다음 열 번호 대신 열 이름을 사용하여 awk 스크립트를 실행하면 매우 중요합니다.


이것은 큰 감사이며 내 목적을 위해 작동합니다. 어색한 초보자에게 이것이 어떻게 작동하는지 명확히 할 수 있습니까? f [$ i] 구문은 무엇이며, awk는 어떤 열이 문자열과 일치하는지 어떻게 알 수 있습니까?
AlexLipp

천만에요. 그것은 절대적으로 기본적인 awk 구문입니다. awk 매뉴얼 페이지 (또는 google it)에서 필드와 배열을 찾으십시오. 추가 print iprint $iprint 등 F 루프에서 [$ i]는`문, 그 도움이된다면 일이 뭐죠를 추적 할 수 있습니다.
Ed Morton

1

을 요청 awk하지만이를 위해보다 전문화 된 도구를 사용할 수도 있습니다 csvtool.

csvtool -t ' ' -u ' ' namedcol foo,baz file

또는

csvtool -t ' ' -u ' ' col 1,3 file

1

파일이 다음을 사용하여 TSV ( "탭으로 구분 된 값") 파일이라고 가정합니다 csvkit.

$ csvcut -t -c foo,baz file.tsv
foo,baz
1,alpha
2,beta
3,gamma

출력 형식은 CSV로 올바르게 지정되지만 TSV로 쉽게 다시 변경할 수 있습니다.

$ csvcut -t -c foo,baz file.tsv | csvformat -T
foo     baz
1       alpha
2       beta
3       gamma

-c옵션을합니다 csvcut또한 숫자와 범위를 취할 수 있으며, 또한 사용할 수 있습니다 재 배열 입력 데이터의 열 (나는 종종 표준에 그리워 기능 cut유틸리티).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.