2017-02-17 2 views
0

У меня есть файл, содержащий 3 столбца и тысячи строк. Ниже приведен пример.Как печатать все строки из столбца1 и только определенные строки из других столбцов

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 и колонка3.

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! Это именно то, что мне нужно! –

Смежные вопросы