Como imprimir arquivos com nomes diferentes classificados por uma parte de seu nome?

0

Eu tenho muitos arquivos nomeados assim:

n2+_PiU_w4_5348757.out
n2+_PiU_w2_5348755.out
n2+_PiU_w1_5348742.out
n2+_PiU_w1_5348729.out
n2+_PiU_w1_5348696.out
n2+_PiU_st3_w3_part6_5630814.out
n2+_PiU_st3_w3_part6_5630721.out
n2+_PiU_st3_w3_part5_5630720.out
n2+_PiU_st3_w3_part4_5630813.out

O ponto é que os nomes deles podem ser completamente diferentes e eu preciso classificá-los pelo número antes de .out , ou seja, pelo ID deles.

Eu dei uma olhada em algumas perguntas semelhantes ( Classificar com base na terceira coluna , Classificação do Linux na última coluna , mas não consigo usar sed ou awk para minhas necessidades.

Você poderia, por favor, fornecer alguma maneira de classificá-los? De preferência usando bash .

    
por Eenoku 03.03.2018 / 19:50

3 respostas

0

awk + sort + cut combinação:

awk -F'_' '{ $0=$NF OFS $0 }1' files_list.txt | sort | cut -d' ' -f2-
  • -F'_' - separador de campos
  • $NF - último campo (por exemplo, 5348696.out )
  • $0=$NF OFS $0 - prefixar o registro atual $0 com o último campo $NF valor para mais classificação simples (por exemplo, 5348757.out n2+_PiU_w4_5348757.out )
  • cut -d' ' -f2- - filtrando campos a partir do segundo

A saída:

n2+_PiU_w1_5348696.out
n2+_PiU_w1_5348729.out
n2+_PiU_w1_5348742.out
n2+_PiU_w2_5348755.out
n2+_PiU_w4_5348757.out
n2+_PiU_st3_w3_part5_5630720.out
n2+_PiU_st3_w3_part6_5630721.out
n2+_PiU_st3_w3_part4_5630813.out
n2+_PiU_st3_w3_part6_5630814.out
    
por 03.03.2018 / 20:01
1

Com o recente (> 4.0) GNU awk, usando um array associativo digitado no campo numérico (do penúltimo ao último):

printf '%s
printf '%s
printf '%s
printf '%s
printf '%s
printf '%s%pre%' * | perl -F'[_.]' -0ne '
  $h{$F[$#F-1]} = $_ }{ for $k (sort { $a <=> $b } keys %h) {print "$h{$k}\n"}
'
' * | gawk 'BEGIN{RS="%pre%0"; FS="[_.]"; PROCINFO["sorted_in"]="@ind_num_asc"} {a[$(NF-1)]=$0} END {for (k in a) print a[k]}' n2+_PiU_w1_5348696.out n2+_PiU_w1_5348729.out n2+_PiU_w1_5348742.out n2+_PiU_w2_5348755.out n2+_PiU_w4_5348757.out n2+_PiU_st3_w3_part5_5630720.out n2+_PiU_st3_w3_part6_5630721.out n2+_PiU_st3_w3_part4_5630813.out n2+_PiU_st3_w3_part6_5630814.out
' * | gawk ' BEGIN { RS="%pre%0"; FS="[_.]"; PROCINFO["sorted_in"]="@ind_num_asc" } { a[$(NF-1)]=$0 } END { for (k in a) print a[k] }'
' * | perl -F'[_.]' -0ne ' $h{$F[$#F-1]} = $_ }{ for $k (sort { $a <=> $b } keys %h) {print "$h{$k}\n"} '
' * | gawk 'BEGIN{RS="%pre%0"; FS="[_.]"; PROCINFO["sorted_in"]="@ind_num_asc"} {a[$(NF-1)]=$0} END {for (k in a) print a[k]}' n2+_PiU_w1_5348696.out n2+_PiU_w1_5348729.out n2+_PiU_w1_5348742.out n2+_PiU_w2_5348755.out n2+_PiU_w4_5348757.out n2+_PiU_st3_w3_part5_5630720.out n2+_PiU_st3_w3_part6_5630721.out n2+_PiU_st3_w3_part4_5630813.out n2+_PiU_st3_w3_part6_5630814.out
' * | gawk ' BEGIN { RS="%pre%0"; FS="[_.]"; PROCINFO["sorted_in"]="@ind_num_asc" } { a[$(NF-1)]=$0 } END { for (k in a) print a[k] }'

ex.

%pre%

Da mesma forma, usando um hash perl:

%pre%     
por 03.03.2018 / 20:11
1

Com zsh globs:

$ printf '%s\n' *_<->.out(noe'(REPLY=${REPLY##*_})')
n2+_PiU_w1_5348696.out
n2+_PiU_w1_5348729.out
n2+_PiU_w1_5348742.out
n2+_PiU_w2_5348755.out
n2+_PiU_w4_5348757.out
n2+_PiU_st3_w3_part5_5630720.out
n2+_PiU_st3_w3_part6_5630721.out
n2+_PiU_st3_w3_part4_5630813.out
n2+_PiU_st3_w3_part6_5630814.out
  • <-> : qualquer sequência de dígitos ( <x-y> sem limite)
  • (...): qualificador glob
  • n : ordem numérica
  • oe'(code)' : pedido baseado na avaliação de code :
  • REPLY=${REPLY##*_} : a chave de classificação é a parte depois da última _
por 03.03.2018 / 22:16