2017-02-17 7 views
0

私は3つの列と1000の行を含むファイルを持っています。以下は例です。column1からすべての行を印刷する方法と、他の列から特定の行のみを印刷する方法

File.txt 
Column1 column2 column3 
173  banana red 
896  banana red 
567  apple green 
742  apple green 
893  apple green 
567  avocado black 
345  avocado black 

column1のすべての行を印刷する必要がありますが、column2とcolumn3の一意の名前のみを印刷する必要があります。

I want this output: 
Column1 column2 column3 
173  banana red 
896    
567  apple green 
742  
893  
567  avocado black 
345  

私は以下の形式で得ることができる場合より良い:

Banana-red: 173 896    
Apple-green: 567 742 893 
Avocado-black: 567 345 
+0

を何試しましたか?あなた自身の試みを掲示してください – Inian

+0

彼らはいつも連続していますか? – 123

+0

質問の内容を確認してください。[mcve] –

答えて

1
$ awk 'NR>1{k=$2"-"$3; a[k]=a[k]" "$1} END{for (k in a) print k ":" a[k]}' file 
apple-green: 567 742 893 
banana-red: 173 896 
avocado-black: 567 345 

行は列は、彼らが発生順になり、inオペレータのランダムな順序の礼儀に出力されます各キー値の入力に使用します。あなたが本当にしたい場合は、各キーの最初の文字は、あなたの質問では、予想される出力のように大文字:

$ awk 'NR>1{k=$2"-"$3; a[k]=a[k]" "$1} END{for (k in a) print toupper(substr(k,1,1)) substr(k,2) ":" a[k]}' file 
Apple-green: 567 742 893 
Banana-red: 173 896 
Avocado-black: 567 345 

、あなたは、彼らが入力で発生した順序で行を出力したい場合:

$ awk 'NR>1{k=$2"-"$3; a[k]=a[k]" "$1l; if (!seen[k]++) keys[++numKeys]=k} END{for (keyNr=1; keyNr<=numKeys; keyNr++) {k=keys[keyNr]; print toupper(substr(k,1,1)) substr(k,2) ":" a[k]} }' file 
Banana-red: 173 896 
Apple-green: 567 742 893 
Avocado-black: 567 345 
+1

ありがとうEd!これはまさに私が必要なものです! –

関連する問題