web-dev-qa-db-ja.com

テキストファイルで繰り返し文字列が最後に出現するようにするにはどうすればよいですか?

数値データと文字列データを含む複数の行と列で構成されるデータファイルがあります。一部の文字列と数値パターンが繰り返されます。最後に繰り返されたパターンを抽出する必要があります。例えば;

715 ANKR PRN 1 value 1
760 ISTA PRN 2 value 2
715 ANKR PRN 1 value 3
760 ISTA PRN 2 value 4
715 ANKR PRN 1 value 5
760 ISTA PRN 2 value 6
  1 ANKR PRN 7 value 8
  2 ISTA PRN 7 value 9
  1 ANKR PRN 7 value 10
  3 ISTA PRN 7 value 11
  1 ANKR PRN 7 value 12

この例では、「715 ANKR PRN 1」、「760 ISTA PRN 2」および「1 ANKR PRN 7」データファイル内で3回繰り返されます。最後に繰り返されたパターンを抽出し、次のように並べ替える必要があります。

715 ANKR PRN 1 value 5
760 ISTA PRN 2 value 6
  1 ANKR PRN 7 value 12
1
deepblue_86

標準ツールを使用して、sortrevuniq

% sort -k1,5 -k6,6nr file.txt | rev | uniq -f1 -d | rev

  1 ANKR PRN 7 value 12
715 ANKR PRN 1 value 5
760 ISTA PRN 2 value 6

必要に応じて出力を並べ替える場合:

% sort -k1,5 -k6,6nr file.txt | rev | uniq -f1 -d | rev | sort -k6,6n

715 ANKR PRN 1 value 5
760 ISTA PRN 2 value 6
  1 ANKR PRN 7 value 12
3
heemayl

どう?

awk '{a[$1 FS $2 FS $3 FS $4 FS $5] = $6; c[$1 FS $2 FS $3 FS $4 FS $5]++}; END{for (i in a) {if (c[i]>1) print i,a[i]}}'

入力でテストする

$ awk '{a[$1 FS $2 FS $3 FS $4 FS $5] = $6; c[$1 FS $2 FS $3 FS $4 FS $5]++}; END{for (i in a) {if (c[i]>1) print i,a[i]}}' file
715 ANKR PRN 1 value 5
760 ISTA PRN 2 value 6
1 ANKR PRN 7 value 12
1
steeldriver