awkを使用して、最初の行に「-」を含む列を削除します。

awkを使用して、最初の行に「-」を含む列を削除します。

テーブルがあります。

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

おすすめ記事