如何打印column1中的所有行以及仅打印其他列中的某些行

时间:2017-02-17 18:56:27

标签: linux bash unix awk sed

我有一个包含3列和数千行的文件。以下是一个例子。

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

1 个答案:

答案 0 :(得分: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