сортировка файлов в каталоге на основе числового индекса в именах файлов - PullRequest
3 голосов
/ 21 ноября 2011

Я использовал цикл 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 до наибольшего доступного (здесь 18) в отсортированном порядке, как это ..

ipsec_packet1.txt
ipsec_packet2.txt
... 
...
ipsec_packet18.txt

Я пытался sort -n k14, но это не помогло. Пожалуйста, предложите мне какой-нибудь вариант сортировки или любую другую функцию bash / awk, которая может мне помочь.

Ответы [ 4 ]

3 голосов
/ 21 ноября 2011

Вы можете попробовать использовать sort с опцией -V, используемой для естественной сортировки чисел в тексте :

for var in `ls ipsec_packet*.txt | sort -V`; do  echo $var; done
1 голос
/ 21 ноября 2011

Если сортировка 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-
0 голосов
/ 22 ноября 2011

Это может работать для вас:

ls -v ipsec_packet*.txt
0 голосов
/ 21 ноября 2011

Я бы предпочел решение codaddict , но вот трюк 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 на любой отдельный символ, который не отображается во входных данных, и указать этот символ как разделитель полей sort с -t.

...