2012-12-11 37 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或...)。