используйте bash для объединения значений с одинаковыми именами - PullRequest
1 голос
/ 01 марта 2012

Входной файл:

AAA 2 3 4 5 
BBB 3 4 5 
AAA 23 21 34
BBB 4 5 62

Я хочу вывод:

AAA 2 3 4 5 23 21 34
BBB 3 4 5 4 5 62

Я чувствую, что должен использовать awk и sed, но не уверен, как это реализовать. У кого-нибудь есть хорошие идеи? Спасибо.

Ответы [ 3 ]

2 голосов
/ 02 марта 2012

Вот вкладыш awk 1 для решения вышеуказанной проблемы:

awk '{line=$2;for(i=3; i<=NF; i++) line=line " " $i; arr[$1]=arr[$1] " " line} END{for (val in arr) print val, arr[val]}' file
2 голосов
/ 02 марта 2012

Это может работать для вас:

sort -sk1,1 file | sed ':a;$!N;s/^\([^ ]* \)\(.*\)\n\1/\1\2/;ta;P;D'
AAA 2 3 4 5 23 21 34
BBB 3 4 5 4 5 62

или gnu awk;

 awk '{if($1 in a){line=$0;sub(/[^ ]* /,"",line);a[$1]=a[$1]line;next};a[$1]=$0}END{n=asort(a);for(i=1;i<=n;i++)print a[i]}' file
AAA 2 3 4 5 23 21 34
BBB 3 4 5 4 5 62
0 голосов
/ 02 марта 2012

Использование ассоциативных массивов bash версии 4

$ declare -A vals
$ while read key nums; do vals[$key]+="$nums "; done < filename
$ for key in "${!vals[@]}"; do printf "%s %s\n" "$key" "${vals[$key]}"; done
AAA 2 3 4 5 23 21 34
BBB 3 4 5 4 5 62
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...