bash合并多行

bash合并多行,bash,Bash,我有一个文件,看起来像: id001 success:100 id002 success:99 id002 failed:1 id003 failed:100 id004 success:50 id004 failed:50 我想将其格式化为: id001 success:100 id002 success:99 failed:1 id003 failed:100 id004 success:50 failed:50 有人能给我一个解决办法吗?谢谢 awk '{a[$1]=a[$1] FS

我有一个文件,看起来像:

id001 success:100
id002 success:99
id002 failed:1
id003 failed:100
id004 success:50
id004 failed:50
我想将其格式化为:

id001 success:100
id002 success:99 failed:1
id003 failed:100
id004 success:50 failed:50
有人能给我一个解决办法吗?谢谢

awk '{a[$1]=a[$1] FS $2}END{for(i in a) print i,a[i]}' file
替代红宝石(1.9+)

使用“awk”:

awk '{line[$1] = line[$1] " " $2}
     END { for (id in line) { printf "%s%s\n", id, line[id] } }'

不使用
awk
(只是为了好玩):

在sed中它很短(但很神秘):


没有看到任何Perl答案。那么,给你:

perl -lnae '$h{$F[0]}.="$F[1] ";END{print "$_ $h{$_}"for(sort keys %h)}' file

不错,但是,需要先对输入进行排序。第一次通过时,您将从文件中删除ID。然后遍历这些ID,每次再次对这些ID调用grep。加上链接到
cut
和xargs(额外进程)。想象一下,如果文件很大:)@kurumi:这是一个反问:)但我可以把
uniq
移到第一个
grep
:pdoesn无所谓。对于迭代的每个id,您仍在再次调用grep。就像我已经说过的,如果你的myfile很大,你有几个ID(比如100个唯一的ID)要通过,那么你会打100次电话给grep。。。。在那个大文件上…:)您的awk解决方案输出与OP的输出不匹配。额外空间。-lnae不容易记住,我更喜欢-lean:)
for i in `grep -o "id[0-9]*" myfile`; do
   echo -n "$i "
   grep $i myfile | cut -c 7- |xargs
done | uniq
sed '$!N;/^\([^ ]*\) .*\n\1/{s/\n[^ ]* / /;};P;D' file
perl -lnae '$h{$F[0]}.="$F[1] ";END{print "$_ $h{$_}"for(sort keys %h)}' file