名前の一部としてソートされた別の名前のファイルを印刷するには?

名前の一部としてソートされた別の名前のファイルを印刷するには?

次のような名前のファイルがたくさんあります。

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

問題はまったく異なる名前を持つ可能性があるため、古い番号(IDなど)で.outソートする必要があることです。

似たような質問を見ました(3番目の列に基づいてソートLinuxソート最後の列)が、使用できないか、必要に応じてsed使用できません。awk

ソートする方法を提案できますか?使用するのが最善ですbash

ベストアンサー1

最近(> 4.0)GNU awkの場合は、数値(最後の2番目)フィールドとして入力された連想配列を使用します。

printf '%s\0' * | gawk '
  BEGIN {
    RS="\000"; FS="[_.]"; 
    PROCINFO["sorted_in"]="@ind_num_asc"
  } 
  {
    a[$(NF-1)]=$0
  } 
  END {
    for (k in a) print a[k]
}' 

前任者。

printf '%s\0' * | gawk 'BEGIN{RS="\000"; 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

同様に、Perlハッシュを使用すると、次のようになります。

printf '%s\0' * | perl -F'[_.]' -0ne '
  $h{$F[$#F-1]} = $_ }{ for $k (sort { $a <=> $b } keys %h) {print "$h{$k}\n"}
'

おすすめ記事