我正在尝试对名称列表进行排序,后跟另一个字符串,例如:
John Doe
AVAIL
Sara Doe
CALL
Jim Doe
AVAIL
我试图按名称对这些进行排序,但似乎无法用排序来解决这个问题。有人可以提供一些指导吗?
我的最终输出如下:
Jim Doe
AVAIL
John Doe
AVAIL
Sara Doe
CALL
非常感谢!
答案 0 :(得分:8)
可能远非最佳,但
sed -r ':r;/(^|\n)$/!{$!{N;br}};s/\n/\v/g' names | sort | sed 's/\v/\n/g'
似乎完成了这项工作(names
是包含记录的文件)。这允许任意长度的记录,而不仅仅是2行。
答案 1 :(得分:0)
不确定它是否会对你起作用,但是这里有一些限制,这就是你需要做的事情。
awk '{if ((NR%2-1)==0) {line=sprintf("%-30s",$0)} else {print line ":" $0}}' | \
sort --key=1,30 | tr ':' '\n'
假设:记录之间没有空行,名称总是少于30个字符,文本中没有:
。
我相信如果假设不同,你可以想出如何改变它。
简而言之,它使用':'作为分隔符合并两行,将第一行填充为30个字符,并使用前30个字符进行排序。然后它打破了线。
答案 2 :(得分: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