2012-04-10 46 views
5

我正在嘗試讀取文件並按特定字段的出現次數對其進行排序。假設我想從日誌文件中找出最重複的日期,然後使用uniq -c選項並按降序對其進行排序。像這樣使用「uniq -c」命令時需要從輸出中刪除計數

uniq -c | sort -nr 

這將產生一些像這樣的輸出 -

809 23/Dec/2008:19:20 

第一場實際上是計數是我的問題....我想ONY之日起上面的輸出,但米不能得到這個。我試圖使用切割命令,並做到這一點

uniq -c | sort -nr | cut -d' ' -f2 

但這只是打印空白...請有人可以幫助我獲取日期,並砍掉計數。我想只有

23/Dec/2008:19:20 

感謝

+0

你確定你的輸出是這樣嗎?我試過'echo'809 23/Dec/2008:19:20'| cut -d''-f2'並且工作正常 – Anirudh 2012-04-10 06:33:53

+1

根據所使用的'uniq'的實現,在重複計數'809'之前可能有零個或多個空格。沒有領先的空白,原始表達式可以正常工作。因爲'uniq -c'的某些實現會產生前導空白,所以會遇到問題。 – 2012-04-10 06:46:45

+0

喬納森..這是一個完美的猜測....我看到在計數之前有一個空白空間。 – ravi 2012-04-10 15:13:37

回答

8

uniq計數由空間,除非有超過7個位數的計數處理,所以你需要做的是這樣的:

uniq -c | sort -nr | cut -c 9- 

到將列(字符位置)向上9。或者你可以使用sed

uniq -c | sort -nr | sed 's/^.\{8\}//' 

或:

uniq -c | sort -nr | sed 's/^ *[0-9]* //' 

這第二個選項是在1000萬以上的重複次數面對強大的;如果你認爲這可能是一個問題,它可能比cut替代方案更好。毫無疑問,還有其他選擇。


警告:在計數通過實驗在Mac OS X 10.7.3,但使用GNU uniqcoreutils 8.3確定。 BSD uniq -c在單個數字計數之前產生了3個前導空格。該POSIX規範說從uniq -c輸出的格式必須象用:

printf("%d %s", repeat_count, line); 

這不會有任何前導空格。鑑於輸出格式這可能變化,在sed腳本與[0-9]正則表達式是在觀察和理論產量的變化處理從uniq -c的最可靠的方法:

uniq -c | sort -nr | sed 's/^ *[0-9]* //' 
+0

謝謝....它幫助了很多,我學到了一個新的命令sed。我對這個shell腳本還不熟悉。 – ravi 2012-04-10 15:16:09

4

相反的cut -d' ' -f2,嘗試

awk '{$1="";print}' 

也許你需要在開始刪除一個多個空白:

awk '{$1="";print}' | sed 's/^.//' 

或完全地與SED,保留原whitspace:

sed -r 's/^[^0-9]*[0-9]+//' 
+0

非常感謝..幫助 – ravi 2012-04-10 18:50:34

+0

Nice:通用解決方案,獨立於OS&uniq版本。 – Sim 2015-05-29 01:42:43

1

的替代解決方案是這樣的:

uniq -c | sort -nr | awk '{print $1, $2}' 

也有可能會輕鬆打印的單個字段。

+0

這隻適用於第二個字段不包含任何空格的情況。 – tripleee 2017-03-23 12:42:37

1

如果你想下游與統計領域的工作,下面的命令將其重新格式化爲一個「管友好」製表符分隔的格式不左填充:

.. | sort | uniq -c | sed -r 's/^ +([0-9]+) /\1\t/' 

對於原來的任務是有點矯枉過正,但經過重新格式化,cut可以用來刪除該字段,如OP意圖:

.. | sort | uniq -c | sed -r 's/^ +([0-9]+) /\1\t/' | cut -d $'\t' -f2- 
1

tr -s添加到管道鏈爲「擠」多個空格成一個空間分隔符:

uniq -c | tr -s ' ' | cut -d ' ' -f3 

tr在一些不起眼的地方非常有用。不幸的是,它沒有擺脫第一個領先的空間,因此-f3