1.目的
重複除き、最新データを残したい。
2.コマンド
sort -k1.4,1.7 -k1.8,1.17r input.txt | awk '!seen[substr($0,4,4)]++'
▼コマンドの説明
・sort -k1.4,1.7 -k1.8,1.17r:
4文字目から7文字目(KEY?)で昇順し、8文字目から17文字目(2023-??-??)で降順に並べます。
・awk '!seen[substr($0,3,3)]++':
・substr($0,4,4):
各行の4文字目から4文字分(4~7文字目)をキーとして抽出。
・seen[...]++:
そのキーが初めて出現した場合に1を返し、2回目以降はスキップします。
・!seen[...]:
初回の出現だけを出力します。
・awk '!seen[substr($0,3,3)]++'
とawk 'seen[substr($0,4,4)]++ ==0'
は同じ効果です。回目のindexは0から開始します。0は1回目の意味です。
・データがカンマ区切りの場合:
awk -F ',' 'seen[$1]++ ==0'
$1
はカンマ区切りの項目1列目
3.入力データ (input.txt)
A01KEY12023-01-01
B02KEY22023-01-02
A03KEY12023-01-03
C04KEY32023-01-01
C05KEY32023-01-04
4.出力結果
A03KEY12023-01-03
B02KEY22023-01-02
C05KEY32023-01-04
5.ファイルに出力
結果を output.txt に保存する場合は、次のようにリダイレクトを使用します。
sort -k1.3,1.5 -k1.9,1.18r input.txt | awk '!seen[substr($0,3,3)]++' > output.txt
重要なポイント
固定長データの場合、フィールド位置を正確に指定する必要があります。
uniq は固定長の部分文字列をキーとして扱う場合に適さないため、awk を推奨します。
コメント欄