簡體   English   中英

awk 'uniq' 在一系列列上

[英]awk 'uniq' on a range of columns

我正在嘗試過濾掉列表的所有重復項,忽略前 n 列,最好使用 awk (但對其他實現開放)

我找到了固定列數的解決方案,但由於我不知道會有多少列,所以我需要一個范圍。 我在這里找到的解決方案

為了清楚起見:我想要實現的是history的別名,它將過濾掉重復項,但保留 history_id 完整,最好不要弄亂訂單。 歷史就是這樣的形式

ID    DATE       HOUR     command
 5612  2019-07-25 11:58:30 ls /var/log/schaubroeck/audit/2019/May/
 5613  2019-07-25 12:00:22 ls /var/log/schaubroeck/         
 5614  2019-07-25 12:11:30 ls /etc/logrotate.d/                       
 5615  2019-07-25 12:11:35 cat /etc/logrotate.d/samba     
 5616  2019-07-25 12:11:49 cat /etc/logrotate.d/named 

因此,此命令適用於最多四個 arguments 長的命令,但我需要用一個范圍替換固定列以解決所有情況:

history | awk -F "[ ]" '!keep[$4 $5 $6 $7]++'

我覺得@kvantour 讓我走上了正確的道路,所以我嘗試了:

history | awk '{t=$0;$1=$2=$3=$4="";k=$0;$0=t}_[k]++' | grep cd

但這仍然會產生重復的行

 1102  2017-10-27 09:05:07 cd /tmp/
 1109  2017-10-27 09:07:03 cd /tmp/
 1112  2017-10-27 09:07:15 cd nagent-rhel_64/
 1124  2017-11-07 16:38:50 cd /etc/init.d/
 1127  2017-12-29 11:13:26 cd /tmp/
 1144  2018-06-21 13:04:26 cd /etc/init.d/
 1161  2018-06-28 09:53:21 cd /etc/init.d/
 1169  2018-07-09 16:33:52 cd /var/log/
 1179  2018-07-10 15:54:32 cd /etc/init.d/

您提出的命令將無法按預期工作。 想象一下,您有兩條線,例如:

a b c d 12 13 1
x y z d 1 21 31

這兩行都將被視為重復的鍵,在數組_中用於兩個d12131

這可能是你感興趣的:

$ history | awk '{t=$0;$1=$2=$3="";k=$0;$0=t}!_[k]++'

這里我們將原始記錄存儲在變量t中。 通過為其分配空值來刪除記錄的前三個字段。 這將重新定義記錄$0並將其存儲在密鑰k中。 然后我們將記錄重置為t的值。 我們使用鍵k進行檢查,它現在包含除前 3 個字段之外的所有字段。

注意:將字段分隔符設置為-F" "不會將其設置為單個空格,而是設置為任何空格序列(空格和制表符)。 這也是默認行為。 如果您想要一個空格,請添加-F"[ ]"

你可以使用排序:

history | sort -u -k4
  • -u表示唯一
  • -k4僅對從第四個開始的所有列進行排序。

運行這個

 1102  2017-10-27 09:05:07 cd /tmp/
 1109  2017-10-27 09:07:03 cd /tmp/
 1112  2017-10-27 09:07:15 cd nagent-rhel_64/
 1124  2017-11-07 16:38:50 cd /etc/init.d/
 1127  2017-12-29 11:13:26 cd /tmp/
 1144  2018-06-21 13:04:26 cd /etc/init.d/
 1161  2018-06-28 09:53:21 cd /etc/init.d/
 1169  2018-07-09 16:33:52 cd /var/log/
 1179  2018-07-10 15:54:32 cd /etc/init.d/

產量:

 1124  2017-11-07 16:38:50 cd /etc/init.d/                                                                                                                                                                         
 1112  2017-10-27 09:07:15 cd nagent-rhel_64/                                                                                                                                                                      
 1102  2017-10-27 09:05:07 cd /tmp/                                                                                                                                                                                
 1169  2018-07-09 16:33:52 cd /var/log/

編輯如果你想保持你可以應用第二種排序的順序:

history | sort -u -k4 | sort -n

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM