Unixシェルスクリプトでグループ化と最大機能を使用する方法

Unixシェルスクリプトでグループ化と最大機能を使用する方法

入力する:

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]=$fh A:このループでは、キー連想配列の要素にthat完全なファイル名が割り当てられます。並べ替えにより、特定の日付の最も遅い日付が表示されます。that
  • print -rC1 -- $h:列sのprintハッシュ値awです。r1 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修飾子がここに追加されました。)

おすすめ記事