2012-12-11 33 views
2

我想獲得唯一的行輸出的計數基於第一 場,其中輸入線看起來像一個文件:計數基於第一場在文件

Forms.js  /forms/Forms.js  http://www.gumby.com/test.htm 404 
Forms.js  /forms/Forms1.js http://www.gumby.com/test.htm 404 
Forms.js  /forms/Forms2.js http://www.gumby.com/test.htm 404 
Interpret.js  /forms/Interpret1.js http://www.gumby.com/test.htm 404  
Interpret.js  /forms/Interpret2.js http://www.gumby.com/test.htm 404 
Interpret.js  /forms/Interpret3.js http://www.gumby.com/test.htm 404 

的東西像這樣:

3 Forms.js /forms/Forms.js  http://www.gumby.com.mx/test.htm 404 
3 Interpret.js /forms/Interpret.js http://www.gumby.com.mx/test.htm 404 

我一直在嘗試排序和uniq的各種組合,但還沒有擊中它。 我可以使用整條線獲得不同的線條,但我只想要第一個字段。 我目前正在使用cygwin。我不是awk識字,但我懷疑這是要走的路線。任何人有一個方便的解決方案?

回答

3

此:

<infile awk '{ h[$1]++ } END { for(k in h) print h[k], k }' 

會得到你:

3 Forms.js 
3 Interpret.js 

如果你也想保持先打用途:

awk '!h[$1] { g[$1]=$0 } { h[$1]++ } END { for(k in g) print h[k], g[k] }' 

輸出:

3 Forms.js /forms/Forms.js http://www.gumby.com/test.htm 404 
3 Interpret.js /forms/Interpret1.js http://www.gumby.com/test.htm 404 

使用GNU awk進行測試。

請注意,這不需要對輸入進行排序。還要注意結果是無序的。

2

Awk是這個工具,但如果你要聰明一點與uniq

$ column -t file | uniq -w12 -c 
     3 Forms.js  /forms/Forms.js  http://www.gumby.com/test.htm 404 
     3 Interpret.js /forms/Interpret1.js http://www.gumby.com/test.htm 404 

column -t對齊所有列,所以我們得到了一個列一個固定的寬度。


還是一個破解如果column不可用是第一列與awk結束線,然後用uniq -c -f4指望最後一列獨特而再次使用awk打印n-1追加領域。

$ awk '{print $0, $1}' file | uniq -c -f4 | awk '{$NF=""; NF--; print}' 
3 Forms.js /forms/Forms.js http://www.gumby.com/test.htm 404 
3 Interpret.js /forms/Interpret1.js http://www.gumby.com/test.htm 404 

這將是很好,如果uniq -f工作就像-f4,4f1,1


或者你可以使用rev扭轉文件,以便uniq -c -f3可以完成,然後rev(你在最後得到的計數但是,如果你沒有column你可能沒有rev

$ rev file | uniq -c -f3 | rev 
Forms.js /forms/Forms.js http://www.gumby.com/test.htm 404 3  
Interpret.js /forms/Interpret1.js http://www.gumby.com/test.htm 404 3 
+0

不幸的是,在cygwin中似乎沒有支持'列'。否則,它似乎是我需要的。 –

+0

'[Cygwin](http://cygwin.com/cgi-bin2/package-cat.cgi?file=util-linux%2Futil-linux-2.17.2-1)支持' linux](http://cygwin.com/cgi-bin2/package-cat.cgi?file=util-linux%2Futil-linux-2.17.2-1)軟件包:) –

+0

如果'column' isn' t可用。 –

0

,我正cut -f 1 | uniq -c。這不會給你整條線,但如果線條不同,打印任何線條無論如何不會有太大意義。取決於你想達到的目標。

0

您可以使用cut來計算第一個字段的數量,但您希望在此字段後打印什麼?

cat file | cut -d " " -f 1 | uniq -c 
1

假設file.txt包含示例輸入:

sort file.txt | awk -f counts.awk file 

回報:

3:Forms.js  /forms/Forms.js  http://www.gumby.com/test.htm 404 
3:Interpret.js  /forms/Interpret1.js http://www.gumby.com/test.htm 404 

awk腳本文件:

cat counts.awk 

# output format is: 
#+ TimesFirstFieldIsRepeated:FirstMatchingLineContents 

BEGIN { 

    plmatch=""; 
    pline=""; 
    outline=""; 
    n=1; 

} 

{ 

if($1 != plmatch && NR != 1) 
    { 
    print n ":" outline; 
    n=1; 
    outline=""; 
    } 

if($1 == plmatch) 
    { 
    n+=1; 
    if(outline == ""){ 
    outline=pline; 
    } 
    } 

plmatch=$1; 
pline=$0; 

} 

END { 
    print n ":" outline; 
} 
2
$ awk '!c[$1]++{v[$1]=$0} END{for (i in c) print c[i],v[i]}' file 
3 Forms.js  /forms/Forms.js  http://www.gumby.com/test.htm 404 
3 Interpret.js  /forms/Interpret1.js http://www.gumby.com/test.htm 404 

上面使用的「共同AWK成語!數組[$ n] ++'到t如果之前已經看到關鍵值($ n,其中n是$ 0或$ 1或$ 4,$ 5或...)。