我在我的脚本中使用了这样的for循环..。
for var in ipsec_packet*.txt; do
echo $var
done
输出
ipsec_packet10.txt
ipsec_packet11.txt
ipsec_packet12.txt
ipsec_packet13.txt
ipsec_packet14.txt
ipsec_packet15.txt
ipsec_packet16.txt
ipsec_packet17.txt
ipsec_packet18.txt
ipsec_packet1.txt
ipsec_packet2.txt
ipsec_packet3.txt
ipsec_packet4.txt
ipsec_packet5.txt
ipsec_packet6.txt
ipsec_packet7.txt
ipsec_packet8.txt
ipsec_packet9.txt
但我希望它们从1开始到最大的avaliable (这里是18),按顺序排列如下..
ipsec_packet1.txt
ipsec_packet2.txt
...
...
ipsec_packet18.txt
我试过sort -n k14
,但没有用。请建议我的排序或任何其他bash/awk功能的变化,可以帮助我。
发布于 2011-11-21 11:08:54
您可以尝试使用sort
和用于在文本中对数字进行自然排序的-V
选项。
for var in `ls ipsec_packet*.txt | sort -V`; do echo $var; done
发布于 2011-11-21 11:56:32
如果GNU不可用(即不支持-V )和如果Perl是可接受的:
perl -le'
print join $/,
map $_->[1],
sort {
$a->[0] <=> $b->[0]
} map [/(\d+)\./, $_],
glob shift
' '*.txt'
另一种选择是:
printf '%s\n' *.txt |
sed 's/.*[^0-9]\([0-9]*\)\./\1,&/' |
sort -n |
cut -d, -f2-
发布于 2011-11-21 12:42:17
我更喜欢codaddict's solution,但是这里有一个sed
+sort
技巧,用于当sort
没有-V
时
for var in $(ls ipsec_packet*.txt | sed 's/[0-9]/\t&/' | sort -n -k2 | sed 's/\t//')
do
echo $var
done
您可以将\t
替换为没有出现在输入数据中的任何单个字符,并使用-t
指定该字符为sort
的字段分隔符。
https://stackoverflow.com/questions/8210733
复制相似问题