Linux列排序函数

Linux列排序函数,linux,bash,sorting,Linux,Bash,Sorting,我正在尝试按输入的列对包含4列的文件进行排序。无论$field的输入是什么,我下面的代码都只会根据第一列进行排序 if (( sort )) then if [ $field==1 ] then sort -k1 $file -o $file elif [ $field==3 ] then sort -k3 $file -o $file elif [ $

我正在尝试按输入的列对包含4列的文件进行排序。无论$field的输入是什么,我下面的代码都只会根据第一列进行排序

if (( sort ))
then
        if [ $field==1 ]
        then
                sort -k1 $file -o $file
        elif [ $field==3 ]
        then
                sort -k3 $file -o $file
        elif [ $field==4 ]
        then
                sort -k4 $file -o $file
        else #for field 2-- this is default
                sort -k2 $file -o $file
        fi
fi

这可以更简单地做到:

if [ $field -lt 1 -o $filed -gt 4 ]; then
    filed=2
fi
sort -k$field $file -o $file
更新。若字段包含数字,则以前的版本有效。 下面是一个使用内置bash测试[[]的新测试:


此处$field=~'^[0-9]+$正在检查变量是否包含数字。

这几乎正是中用于说明如何将坏问题转化为好问题的问题。重复项标记为ksh,但答案适用于此处。不要使用-o;使用[$field-lt 1]|[$field-gt 4]相反。@chepner为什么?我发现,其中-o/-a标记为可读性较差。也许我遗漏了什么?它们只是伪标准,是POSIX标准的可选扩展;它们并没有被完全弃用,但POSIX标准认为它们过时了。出于历史原因,它们基本上是受支持的。
if [[ ! $field =~ ^[0-9]+$ || $field < 1 || $field > 4 ]]; then
    filed=2
fi
sort -k$field $file -o $file