簡體   English   中英

如何在bash中使用多行進行排序?

[英]How to sort with multiple lines in bash?

我正在嘗試排序名稱列表,后跟另一個字符串,例如:

John Doe
AVAIL

Sara Doe
CALL

Jim Doe
AVAIL

我試圖按名稱對這些進行排序,但似乎無法用排序來解決這個問題。 有人可以提供一些指導嗎?

我的最終輸出看起來像這樣:

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::/g p }' | sort | sed "s/::/\n/g"
Jim Doe
AVAIL

John Doe
AVAIL

Sara Doe
CALL

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM