9

我正在尝试对名称列表进行排序,然后是另一个字符串,例如:

John Doe
AVAIL

Sara Doe
CALL

Jim Doe
AVAIL

我正在尝试按名称对它们进行排序,但似乎无法通过排序来解决。有人可以提供一些指导吗?

我的最终输出如下所示:

Jim Doe
AVAIL

John Doe
AVAIL

Sara Doe
CALL

非常感激!

4

3 回答 3

9

可能远非最佳,但

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

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

于 2012-07-03T17:31:22.530 回答
0

不确定它是否适合您,但有一些限制,这里有一条线可以满足您的需要。

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

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

如果假设不同,我相信您可以弄清楚如何更改它。

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

于 2012-07-03T17:33:34.027 回答
0

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

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

John Doe
AVAIL

Sara Doe
CALL
于 2012-07-03T17:39:41.533 回答