2012-03-01 3 views
1

входного файла:использование Баш объединить значения одного и того же имени

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, но не знаете, как пойми. У кого-нибудь есть хорошие идеи? Благодарю.

ответ

2

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

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

большое спасибо – user1224398

+0

oh..the 'awk' один выглядит сложным .. – user1224398

2

Вот 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 
+0

awesome! большое спасибо! – user1224398

0

Использование Баш версии 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 
+0

Большое спасибо. – user1224398

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