サイドバーの壁紙
博主头像
tin博主等级

子の曰わく、我れ三人行なえば必ず我が師を得(う)。其の善き者を択びてこれに従う。其の善からざる者にしてこれを改む。

  • 累積執筆 72 記事
  • 累計作成 32 タグ
  • 累計受入 2 コメント

目 次CONTENT

記事目次

重複除き、最新データを残す(sort、awk)

tin
tin
2024-12-05 / 0 コメント / 0 いいね! / 102 読み / 466 文字

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 を推奨します。

0
  • 0

コメント欄