sort对文本文件的行进行排序,其中一条记录始终由换行符分隔。作为一个例外,它也支持\0作为记录分隔符,但无法更改记录分隔方式的逻辑。
您可以利用上述异常来实现decorate-sort-undecorate模式,如下所示:
chunk | sort -z -t'
' -k1 | unchunk
chunk将每三行组合成line1\0line2\0line3\n,以允许sort -z将三行块作为单个记录获取,并按记录-t'\n' -k1中的第一个字段排序。unchunk只是全部变\0回\n.
用 Perl 表示,chunk看起来像这样:
perl -pe 'chomp;$_.=($.%3)?"\n":"\0"'
(类似的咒语可以很容易地用awkor编写sed,而 C 版本不会更长。)
unchunk不超过tr '\0' '\n'。因此完整的排序是:
perl -pe 'chomp;$_.=($.%3)?"\n":"\0"' | sort -z -t'
' -k1 | tr '\0' '\n'
给定输入文件
b
2nd b line
bla 3rd b line
a
some a line
other a line
x
first x line
other x line
...上述管道产生:
a
some a line
other a line
b
2nd b line
bla 3rd b line
x
first x line
other x line