使用 shell 按字母顺序对多行记录进行排序

Sorting multiple-line records in alphabetical order using shell

有一个文件具有以下结构:

L. feritas
E. ferity

L. ars
E. art

L. solitudo
E. solitude

L. celeritas
E. celerity

每一行是一个字段,一条记录跨越多行,包括一个L.字段、一个E.字段和一个空行。如何按标记为 L. 的字段对记录进行排序,同时保持多行记录的完整性?

L. ars
E. art

L. celeritas
E. celerity

L. feritas
E. ferity

L. solitudo
E. solitude

想出一些东西的快速方法是:

$ cat file | awk 'BEGIN{RS=""; FS="\n"; OFS="|"}{=}1' \
  | sort | awk 'BEGIN{FS="|";OFS="\n";ORS="\n\n"}{=}1'

或者你可以在单个 Gnu AWK 中编写它,

$ awk 'BEGIN{RS=""; ORS="\n\n"; FS=OFS="\n"; PROCINFO["sorted_in"]="@val_str_asc"}
       {a[NR]=[=11=]}END{for(i in a) print a[i]}' file

如果不想让最后一行为空,可以这样做:

$ cat file | awk 'BEGIN{RS=""; FS="\n"; OFS="|"}{=}1' \
  | sort | awk 'BEGIN{FS="|";OFS="\n"}{=}1' | sed '$d'


$ awk 'BEGIN{RS=""; FS=OFS="\n"; PROCINFO["sorted_in"]="@val_str_asc"}
       {a[NR]=[=12=]}END{for(i in a) print a[i] (--NR?"\n":"")}' file