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

使用shell按字母顺序排序多行记录,shell,sorting,text-processing,Shell,Sorting,Text Processing,有一个文件具有以下结构: 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. so

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

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=$1}1' \
  | sort | awk 'BEGIN{FS="|";OFS="\n";ORS="\n\n"}{$1=$1}1'
或者你可以把它写在一个Gnu AWK中

$ awk 'BEGIN{RS=""; ORS="\n\n"; FS=OFS="\n"; PROCINFO["sorted_in"]="@val_str_asc"}
       {a[NR]=$0}END{for(i in a) print a[i]}' file
如果不希望最后一行为空,可以执行以下操作:

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


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

第二个将删除重复项(如果有)。您仍然可以使用gawk排序,例如
a[NR]=$0
END{asort(a);…}
@BenjaminW。我添加了一个更新版本。谢谢你指出这一点。它工作得很好,除了一件事:文件的最后一行是空白的。谢谢!第一个解决方案如何?@J.Doe如果这回答了您的问题,请查看