入力する:
20210602_1234_abc.txt
20210603_1234_def.txt
20210507_5678_abc.txt
20210607_5678_def.txt
出力:
20210603_1234_def.txt
20210607_5678_def.txt
私のスクリプトは最初に2番目の列(ここでは1234と5678)に基づいて検索し、そのファイルに関連付けられた最大の日付を持つファイル(この場合)20210603と20210607を選択する必要があります。
UNIXシェルスクリプトを使用してどのようにこれを取得できますか?
ベストアンサー1
zsh
シェルの場合、次のファイルが現在のディレクトリにあるとします。
$ ls
20210507_5678_abc.txt 20210602_1234_abc.txt 20210603_1234_def.txt 20210607_5678_def.txt
$ typeset -A h; for f (*_*_*.txt) h[${${(s[_])f}[2]}]=$f; print -rC1 - $h
20210603_1234_def.txt
20210607_5678_def.txt
どこ
- 拡張子は
*_*_*.txt
語彙順にソートされるため、時間順にソートされます。 ${(s[_])f}
分割$f
する_
${...[2]}
この分割による2番目のフィールドの取得h[that]=$f
h
A
:このループでは、キー連想配列の要素にthat
完全なファイル名が割り当てられます。並べ替えにより、特定の日付の最も遅い日付が表示されます。that
print -rC1 -- $h
:列sのprint
ハッシュ値awです。r
1
C
スクリプトを作成する場合は、読みやすくするためにスクリプトを少し分解することができます。
typeset -A max
for file in *_*_*.txt(N); do
parts=( ${(s[_]file} )
max[$parts[2]]=$file
done
print -rC1 -- $max
N
(globがファイルと一致しない場合は、エラーを防ぐために(nullglob)glob修飾子がここに追加されました。)