따라서 특정 열에 공백이 있는 탭으로 구분된 입력 파일이 있습니다. 예를 들면 다음과 같습니다.
입력 파일:
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