Bash

Uniq 基於最後一個欄位,保留最後一行,並追加重複數

  • September 16, 2020

我需要一些幫助來在 bash 腳本中實現 awk 命令以實現以下邏輯。嘗試了排序/唯一組合,但沒有運氣。

我有一個帶有時間戳的長列表,前面有一些數字,如下所示。

[2020-09-15 09:03:21.835335] 1021
[2020-09-15 09:03:21.935335] 1021
[2020-09-15 09:03:22.835335] 1022
[2020-09-15 09:03:25.835335] 1022
[2020-09-15 09:04:21.835335] 1023
[2020-09-15 09:05:21.835335] 1023
[2020-09-15 09:04:22.835335] 1023
[2020-09-15 09:05:23.835335] 1023

在最終結果中,我想用數字處理上面第 2 列的列表。在最終處理的數據中,我想從第 2 列計算唯一數字(即使只出現一次)並將其添加到數字前面的新列中。我真正需要的是從數字列中上次出現重複/唯一條目的時間戳。

[2020-09-15 09:03:21.935335] 1021 2
[2020-09-15 09:03:25.835335] 1022 2
[2020-09-15 09:05:23.835335] 1023 4

任何幫助將不勝感激!

謝謝!

tac file | uniq -c -f 2 | awk '{$(NF+1)=$1;$1=""}1' | tac

tac以相反的順序列印文件。這是為了保證最後一次出現的重複行將被保留。

uniq -c -f 2僅通過跳過前兩個欄位來比較最後一個欄位-f 2。它在重複行的數量前面加上-c標誌,所以我們必須將計數轉移到最後一個欄位。就是awk '{$(NF+1)=$1;$1=""}1'這樣。

最後,tac讓一切恢復原狀。

[2020-09-15 09:03:21.935335] 1021 2
[2020-09-15 09:03:25.835335] 1022 2
[2020-09-15 09:05:23.835335] 1023 4

引用自:https://unix.stackexchange.com/questions/609683