因此,这是一个bash函数,其中的参数完全类似于sort。支持文件和管道。
function skip_header_sort() {
if [[ $# -gt 0 ]] && [[ -f ${@: -1} ]]; then
local file=${@: -1}
set -- "${@:1:$(($#-1))}"
fi
awk -vsargs="$*" 'NR<2{print; next}{print | "sort "sargs}' $file
}
这个怎么运作。此行检查是否至少有一个参数,最后一个参数是否是文件。
if [[ $# -gt 0 ]] && [[ -f ${@: -1} ]]; then
这会将文件保存为单独的参数。由于我们即将删除最后一个参数。
local file=${@: -1}
在这里,我们删除最后一个参数。由于我们不想将其作为排序参数传递。
set -- "${@:1:$(($#-1))}"
最后,我们执行awk部分,传递参数(如果是文件则减去最后一个参数)以进行awk排序。这是戴夫(Dave)最初提出的,并进行了修改以接受排序参数。我们依靠这样的事实:$file如果要进行管道传输,它将为空,因此被忽略。
awk -vsargs="$*" 'NR<2{print; next}{print | "sort "sargs}' $file
逗号分隔文件的示例用法。
$ cat /tmp/test
A,B,C
0,1,2
1,2,0
2,0,1
# SORT NUMERICALLY SECOND COLUMN
$ skip_header_sort -t, -nk2 /tmp/test
A,B,C
2,0,1
0,1,2
1,2,0
# SORT REVERSE NUMERICALLY THIRD COLUMN
$ cat /tmp/test | skip_header_sort -t, -nrk3
A,B,C
0,1,2
2,0,1
1,2,0