如何在bash中sorting多行?

我正在尝试sorting的名称后面跟另一个string,如:

John Doe AVAIL Sara Doe CALL Jim Doe AVAIL 

我试图按名称sorting,但似乎无法弄清楚。 有人可以提供一些指导?

我的最终输出将如下所示:

 Jim Doe AVAIL John Doe AVAIL Sara Doe CALL 

非常感激!

可能远不是最优的,但是

 sed -r ':r;/(^|\n)$/!{$!{N;br}};s/\n/\v/g' names | sort | sed 's/\v/\n/g' 

似乎做的工作( names是有记录的文件)。 这允许任意长度的记录,而不仅仅是2行。

不知道它是否会为你工作,但有一些限制,这是一种做你所需要的行。

 awk '{if ((NR%2-1)==0) {line=sprintf("%-30s",$0)} else {print line ":" $0}}' | \ sort --key=1,30 | tr ':' '\n' 

假设:记录之间没有空行,名称始终少于30个字符,文本中没有使用:

如果假设不同,我相信你可以想象如何改变它。

简而言之,将两行使用“:”作为分隔符合并,将第一行填入30个字符,并使用前30个字符进行排序。 然后它打破了线路。

不是直接的,但你可以使用这样的一些中间形式。 我假设你的价值(CALL,AVAIL等)是有限的。 否则你需要使用更复杂的模式,但是可以完成。 实际上任何事情都可以在bash中完成:-)

 cat sorting | sed -n '1h; 1!H; ${ g; s/\nCALL\n/::CALL::/g; s/\nAVAIL\n/::AVAIL::/g ; s/\nAVAIL/::AVAIL::/gp }' | sort | sed "s/::/\n/g" Jim Doe AVAIL John Doe AVAIL Sara Doe CALL