テーブルがあります。
M - A A -
- A G - -
M - - - G
私は以下を実行したい:最初の行の列に「-」が含まれている場合は、その列の印刷をスキップします。
予想される出力は次のとおりです。
M A A
- G -
M - -
私は成功せずにこのようなことを試しました。
awk 'NR==1 && $i!="-" {print $i}'
コマンドを修正する方法を知っている人はいますか?
ベストアンサー1
の変種エドモートンの答えは、フィールド番号によって最初の行にないフィールドを記憶し、新しいレコードを印刷する前に、配列に格納されているインデックスに-
基づいて入力内の各レコードを再設定します。out
FNR == 1 {
for (i = 1; i <= NF; ++i)
if ($i != "-") out[++nf] = i
}
{
for (i = 1; i <= nf; ++i)
a[i] = $(out[i])
$0 = ""
for (i = 1; i <= nf; ++i)
$i = a[i]
print
}
ここでは、読みやすくするためにいくつかの効率を犠牲にして、2番目のブロックの単一ループで必須フィールドを印刷するのではなく、別のループでレコードを再構築しました。
テスト:
$ awk -f script.awk file
M A A
- G -
M - -
タブを出力フィールド区切り文字として使用して実行します。
$ awk -v OFS='\t' -f script.awk file
M A A
- G -
M - -
入力データがタブで区切られているかどうかによって、コードの行が少し長すぎます。
$ cut -f "$(awk -v OFS=',' '{ nf=split($0,a); $0=""; for (i=1; i<=nf; ++i) if (a[i]!="-") $(++NF)=i; print; exit }' file)" file
M A A
- G -
M - -
awk
これは出力に使用されます。フィールド番号-
カンマで区切られたリストで、最初の行にはありません。その後、そのリストがリストに渡され、cut -f
実際にファイルのデータが出力されます。ファイル名(ここで省略file
)はコマンドラインに2回与えられます。一度はについて、awk
もう一度はについて再提供されますcut
。