次のような名前のファイルがたくさんあります。
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
最後のフィールド値を追加します(例:)。$NF
5348757.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