使用Bash将向量排序为数字,然后是字母

使用Bash将向量排序为数字,然后是字母,bash,sorting,Bash,Sorting,假设我有一个包含以下列的文件: M 2 10 X 是否可以根据此列进行排序以获得: 2 10 M X 我尝试过使用-g和-n,但这些输出字母先,然后是数字 提前感谢。sort可能没有此支持。我只能想到这种欺骗模式: sort-n您可以按字母排序一次,然后按数字排序。所以 sort test.txt -o test.txt && sort -n test.txt -o test.txt 版本排序似乎可以满足您的需要 sort -V <<END M 2 10 X END

假设我有一个包含以下列的文件:

M
2
10
X

是否可以根据此列进行排序以获得:

2
10
M
X

我尝试过使用-g和-n,但这些输出字母先,然后是数字


提前感谢。

sort可能没有此支持。我只能想到这种欺骗模式:


sort-n您可以按字母排序一次,然后按数字排序。所以

sort test.txt -o test.txt && sort -n test.txt -o test.txt

版本排序似乎可以满足您的需要

sort -V <<END
M
2
10
X
END
可能需要GNU排序相当长,但是:

re='^[0-9]+$'; 
while read line; 
do 
   if ! [[ $line =~ $re ]]
   then 
        printf "%d,A\n" "'$line"
   else 
        printf "%d,N\n" "$line"
   fi
done < file | sort -t ',' -k1n | awk -v FS=',' '{ if($2=="N"){print $1} else {printf "%c\n",$1}}'
re='^[0-9]+$';
读行时;
做
如果![$line=~$re]]
然后
printf“%d,A\n”“$line”
其他的
printf“%d,N\N”“$line”
fi
已完成
你确定吗?
sort-n
将字母放在第一位,因为它们被映射为零。第一个排序将把数字放在第一位,但是按代码集顺序,而不是数字顺序。我没有测试附加在一起的两个命令,但我确实测试了一个接一个的命令。这可能就是问题所在。现在我想我记得我学习到了同时执行&&时的情况?您将多久执行一次,以及将在多大的数据文件上执行?如果是“一次”和“小”,那么你已经从Anubhava那里得到了一个足够体面的答案。如果它是“多次”和“巨大的”,那么您仍然可以使用该技术,或者您可以设计一个程序,在每行的开头创建一个好的排序键(例如数字为
0
,字母为
1
),然后是行的其余部分。然后可以使用
sort-k1,1-k2n,2
,最后去掉添加的前缀<代码>sed-e'/^[0-9]/s/^/0/'-e'/^[^0-9]/s/^/1/'文件…|排序-k1,1-k2n,2 | sed's/^[01]/'
或其左右。很多时候,大量文件
2
10
M
X
re='^[0-9]+$'; 
while read line; 
do 
   if ! [[ $line =~ $re ]]
   then 
        printf "%d,A\n" "'$line"
   else 
        printf "%d,N\n" "$line"
   fi
done < file | sort -t ',' -k1n | awk -v FS=',' '{ if($2=="N"){print $1} else {printf "%c\n",$1}}'