헤더 이름으로 awk의 열을 인쇄합니다.

헤더 이름으로 awk의 열을 인쇄합니다.

그런 텍스트 파일이 있어요

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

awk를 사용하여 1 및 3과 같은 특정 열을 인쇄할 수 있지만 {print $1, $3}대신 열의 헤더를 지정하여 인쇄할 열을 지정하고 싶습니다 {print $foo, $baz}. 이는 유용하므로 어떤 열이 어느 열인지 확인하기 위해 수동으로 파일을 열고 열을 계산할 필요가 없으며 열 번호나 순서가 변경되는 경우 스크립트를 업데이트할 필요가 없습니다. awk(또는 다른 쉘 도구)를 사용하여 이 작업을 수행할 수 있나요?

답변1

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 스크립트를 실행하는 것은 매우 중요합니다.

답변2

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

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

또는

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

답변3

파일이 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

옵션 -ccsvcut숫자와 범위도 취할 수 있으며 다음 용도로도 사용할 수 있습니다.재배열하다입력 데이터의 열(표준 유틸리티에서 종종 놓치는 기능 cut)

관련 정보