2017-04-10 1 views
1
Id,responseId,name,test1,test2,bcid,stype 
213,A_123456,abc,test,zzz,987654321,alpha 
412,A_234566,xyz,test,xxx,897564322,gama 
125,A_456314,ttt,qa,yyy,786950473,delta 
222,A_243445,hds,test,fff,643528290,alpha 
456,A_466875,sed,test,hhh,543819101,beta 

上記のカラムresponseIdとbcidを抽出します。本当に近い答えが見つかりました。AWKはカラム名に基づいてカラムを表示し、ヘッダと最後のデリミタを削除します

awk -F ',' -v cols=responseID,bcid '(NR==1){n=split(cols,cs,",");for(c=1;c<=n;c++){for(i=1;i<=NF;i++)if($(i)==cs[c])ci[c]=i}}{for(i=1;i<=n;i++)printf "%s" FS,$(ci[i]);printf "\n"}' <file_name> 

ただし、最後に「、」、下に示すようにヘッダーが表示されます。

responseId,bcid, 
A_123456,987654321, 
A_234566,897564322, 
A_456314,786950473, 
A_243445,643528290, 
A_466875,543819101, 

bcidの後にヘッダーと "、"を印刷しないようにするにはどうすればよいですか?

+0

の列がスペースやカンマを持っていますか?列の順序は変わりますか? – dawg

+0

シェル変数を入力に渡すのか、変数としてawkに渡しますか? – RavinderSingh13

+0

列にはカンマしかなく、列の順序が変更されるので、列名でそれらを読み取る必要があります。 –

答えて

2

入力実行する方法

$ cat infile 
Id,responseId,name,test1,test2,bcid,stype 
213, A_123456, abc, test, zzz, 987654321, alpha 
412, A_234566, xyz, test, xxx, 897564322, gama 
125, A_456314, ttt, qa, yyy, 786950473, delta 
222, A_243445, hds, test, fff, 643528290, alpha 
456, A_466875, sed, test, hhh, 543819101, beta 

スクリプト

$ cat byname.awk 
FNR==1{ 
    split(header,h,/,/); 
    for(i=1; i in h; i++) 
    { 
     for(j=1; j<=NF; j++) 
     { 
      if(tolower(h[i])==tolower($j)){ d[i]=j; break } 
     } 
    } 
    next 
} 
{ 
    for(i=1; i in h; i++) 
     printf("%s%s",i>1 ? OFS:"", i in d ?$(d[i]):""); 
    print ""; 
} 

、としてOFS(出力フィールドセパレータ)を設定しますか?

$ awk -v FS=, -v OFS=, -v header="responseID,bcid" -f byname.awk infile 
A_123456, 987654321 
A_234566, 897564322 
A_456314, 786950473 
A_243445, 643528290 
A_466875, 543819101 

ワンライナー

$ awk -v FS=, -v OFS=, -v header="responseID,bcid" 'FNR==1{split(header,h,/,/);for(i=1; i in h; i++){for(j=1; j<=NF; j++){if(tolower(h[i])==tolower($j)){ d[i]=j; break }}}next}{for(i=1; i in h; i++)printf("%s%s",i>1 ? OFS:"", i in d ?$(d[i]):"");print "";}' infile 
A_123456, 987654321 
A_234566, 897564322 
A_456314, 786950473 
A_243445, 643528290 
A_466875, 543819101 
+1

パーフェクト!これは期待どおりに動作します。 –

+0

@manasachandrashekar:将来的にヘッダーをresultと一緒に残しておきたい場合は、キーワード 'next'を削除して、大文字小文字を区別しないヘッダーマッチを探します。大文字と完全に一致させたい場合は' tolower (h [i])== tolower($ j) 'から' h [i] == $ j'まで、最高の願いを.. –

+1

はそれを得ました!再度、感謝します!これは本当に役に立ちました –

0

試してみてください。

awk '{NR==1?FS=",":FS=", ";$0=$0} {print $2 OFS $(NF-1)}' OFS=, Input_file 

はその後、第二フィールドと第二最後のフィールドを印刷する「」行が1行目であるならば、「」で区切り文字を作ると、フィールドセパレータを作る他の線をチェック。

+0

混乱して申し訳ありません。ファイル内にはスペースがありません。私の質問を編集させてください。私はちょうど出現から最後のデリミタを削除する方法を知りたい –

関連する問題