awk 명령에서 이름으로 열을 참조하는 방법은 무엇입니까?

awk 명령에서 이름으로 열을 참조하는 방법은 무엇입니까?

따라서 특정 열에 공백이 있는 탭으로 구분된 입력 파일이 있습니다. 예를 들면 다음과 같습니다.

입력 파일:

A    B    C    D
1    12   34   545
34        12   56
23   10   15   67
31        99   100

이제 내 목표는 공백이 있는 모든 줄을 다음과 같이 출력 파일에 추가하는 것입니다.

결과물 파일:

34       12    56
31       99    100

그래서 저는 이 명령을 사용하여 결과를 얻었습니다.

awk -F $'\t' '$2 == ""' input_file >> output_file

이는 "B" 열이 항상 위치 2에 있으면 잘 작동하지만 다른 곳에 있으면 작동하지 않습니다. 주소로 "B"열을 지정하는 방법이름awk명령 에 ?

답변1

AFAIK 헤더 필드를 반복하고 일치하는 열의 인덱스를 기록하는 것 외에는 awk에서 이를 수행할 수 있는 방법이 없습니다.

awk -F '\t' 'NR==1{for(i=1;i<=NF;i++) if($i=="B") bi=i} $bi == ""' file.tsv

Miller에 액세스할 수 있는 경우 이름으로 직접 필터링할 수 있습니다.

mlr --tsv filter '$B == ""' file.tsv

또는 Python의 CSVKit에 있는 유틸리티를 사용하세요.

csvgrep -t -c B -r "." -i file.tsv | csvformat -T

답변2

첫 번째 줄을 처리하여 헤더 이름을 열 번호에 매핑할 수 있습니다.

awk -F'\t' '
  NR == 1 {for (i=1; i<=NF; i++) column[$i] = i}
  $(column["B"]) == ""
' input_file

답변3

awk 명령의 또 다른 변형:

awk '!Bi{ FS="B"; $0=$0; Bi=1+gsub(/\t/,//,$1); FS="\t"; next} $Bi==""' infile

관련 정보