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"'
(类似的咒语可以很容易地用awk
or编写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