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

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

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

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"}
'

答え2

ボールでzsh

$ 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
  • <->:一連の数字(<x-y>制限なし)
  • (...): グローバル修飾子
  • n: 数値順
  • oe'(code)':以下の評価に基づいてソートされましたcode
  • REPLY=${REPLY##*_}:ソートキーは最後のキーの次の部分です。_

答え3

awk+sort+cutコンビネーション:

awk -F'_' '{ $0=$NF OFS $0 }1' files_list.txt | sort | cut -d' ' -f2-
  • -F'_'- フィールド区切り記号
  • $NF- 最後のフィールド(例5348696.out
  • $0=$NF OFS $0- 追加の直接ソートのために、現在のレコードの前に$0最後のフィールド値を追加します(例:)。$NF5348757.out n2+_PiU_w4_5348757.out
  • cut -d' ' -f2-- 2番目のフィールドから始まるフィルタフィールド

出力:

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

関連情報