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

时间:2018-09-12 13:31:12

标签: 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. solitude

1 个答案:

答案 0 :(得分:2)

提出一些建议的快速方法是:

$ 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