bash группировка по слову и конкат - PullRequest
0 голосов
/ 09 января 2020

У меня есть файл, который выглядит следующим образом:

tiger sherry
tiger lina
tiger piku
tiger tery
cat kate
cat Gatsby

Я хочу сгруппировать по:

tiger sherry, lina, piku, tery
cat Kate, Gatsby

Ответы [ 3 ]

2 голосов
/ 09 января 2020

Не могли бы вы попробовать следующее.

awk '
BEGIN{
  OFS=","
}
{
  a[$1]=(a[$1]?a[$1] OFS:"")$2
}
END{
  for(i in a){
    print i FS a[i]
  }
}
' Input_file

Объяснение: Добавление подробного объяснения для кода выше.

awk '                               ##Starting awk program from here.
BEGIN{                              ##Starting BEGIN section from here.
  OFS=","                           ##Setting OFS as comma here.
}                                   ##Closing BLOCK for BEGIN section of this code.
{                                   ##Starting main BLOCK from here.
  a[$1]=(a[$1]?a[$1] OFS:"")$2      ##Creating an array named a whose index is $1 and value is $2.
}
END{                                ##Starting END BLOCK for this awk program.
  for(i in a){                      ##Starting for loop traversing through array a.
    print i FS a[i]                 ##Printing variable i,FS and value of array a.
  }
}
' Input_file                        ##Mentioning Input_file name here.
1 голос
/ 09 января 2020

perl:

perl -lane '
    push @{$words{$F[0]}}, $F[1];
  } END {
    print $_, " ", join(", ", @{$words{$_}}) for (keys %words);
' file
0 голосов
/ 09 января 2020

Предполагая, что имя файла вашего ввода input , вы можете выполнить следующий скрипт:

#!/bin/bash

awk '{ if (($1 != group) && (group != "")) 
  { print group" "names; names = ""}
  else 
  { if (names == "") 
    { names = $2 } 
    else 
    { names = names", "$2 }
  }
  group=$1
}
END {print group" "names}' input
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...