2016-12-07 7 views
1

列名でTSVファイルを投影しようとしています。これまでのところ、私はSOに質問からインスピレーションを取った、と私は、t.awkをこのスクリプトを使用しています:AWVで名前でTSVファイル列をプロジェクト

BEGIN { 
    OFS="\t" 
    split(cols,out,",") 
} 
NR==1 { 
    for (i=1; i<=NF; i++) 
     ix[$i] = i 
} 
NR>1 { 
    for (i=1;i<=length(out);i++) 
     printf "%s%s", $ix[out[i]], OFS 
    print "" 
} 

私のように呼び出すことができる:それはのとき1を除いて、完璧に動作

awk -f t.awk -v cols=name1,name2,nameN input.tsv 

cols属性で指定された名前が存在しません。

このケースでも動作させるには、どうすれば変更できますか?私はパラメータとして渡された存在しないカラム名を無視するだけです。

例(編集): input.tsvを考えてみましょう:

a b c 
1 2 3 
2 3 4 
5 6 7 

私はコマンドを希望:

awk -f t.awk -v cols=a,c,batman input.tsv 

生成する:これまでの

a c 
1 3 
2 4 
5 7 

けど、それは与える:

ここでは
+1

サンプルデータを提供して、効果がないことをお知らせください。 – Inian

+0

あなたはどのawkバージョンを使用していますか? 'GNU Awk 4.1.3'は、サンプル呼び出しのためにいくつかのランダムな出力を生成します。 – Inian

+0

現在、私はMacOS上にあり、awkバージョン20070501 – Aslan986

答えて

1

あなたはこのようあなたのawkスクリプトを微調整することができます

BEGIN { 
    OFS="\t" 
    split(cols, out, ",") 
    for (i in out) 
     c[out[i]] 
} 
NR==1 { 
    for (i=1; i<=NF; i++) 
     if ($i in c) 
      hdr[i] = $i 
} 
{ 
    k=0 
    for (i=1; i<=NF; i++) 
     if (i in hdr) 
      printf "%s%s", (k++?OFS:""), $i 
    print "" 
} 

次にとしてそれを実行します。

:両方は、この出力を生成します

awk -f t.awk -v cols=c,batman,a input.tsv 

awk -f t.awk -v cols=a,c,batman input.tsv 

a c 
1 3 
2 4 
5 7 
1

は単純書き換え

$ awk -v cols='a,c,x' -v d=',' 'NR==1 {for(i=1;i<=NF;i++) if(d cols d ~ d $i d) ix[i]} 
             {for(i in ix) printf "%s", $i OFS; 
             print ""}' file 

a c 
1 3 
2 4 
5 7 

列の順序は、しかし、保存されないことがあります。

0

この操作を行います。雨の日の例に遭遇したときに、あなたが振り返ると、後でそれを強化する必要がある場合

BEGIN { 
    FS=OFS="\t" 
    numIdxs = split(cols,idx2name,/,/) 
} 
NR==1 { 
    for (fldNr=1; fldNr<=NF; fldNr++) { 
     name2nr[$fldNr] = fldNr 
    } 
    next 
} 
{ 
    for (idx=1; idx<=numIdxs; idx++) { 
     name = idx2name[idx] 
     if (name in name2nr) { 
      fldNr = name2nr[name] 
      fldVal = $(name2nr[fldNr]) 
      printf "%s%s", (numPrinted++ ? OFS : ""), fldVal 
     } 
    } 
} 
numPrinted { print ""; numPrinted=0 } 

は私を信頼し、あなたはずっと幸せになるでしょう。

元のスクリプトと同様に、上記のコマンドは、入力ファイルで発生する順序ではなく、コマンドラインで指定した順序でフィールドを出力するので、必要に応じてコマンドラインから列を並べ替えることができます。

関連する問題