したがって、特定の列にスペースがあるタブ区切りの入力ファイルがあります。たとえば、次のようになります。
入力ファイル:
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