使用 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
有一个文件具有以下结构:
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