使用bash组合同名的值

时间:2012-03-01 19:56:37

标签: bash sed awk

输入文件:

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

我觉得我应该使用awksed,但不知道如何实现它。有没有人有什么好主意?感谢。

3 个答案:

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

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

答案 2 :(得分:0)

使用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