之后如何打印唯一编号?

www*_*www 1 shell awk text-processing

gawk '$9=="404" || $9=="403"' log.txt | gawk '{print $7}' |  sort -k7 | uniq -c | sort -nr
Run Code Online (Sandbox Code Playgroud)

输出:

28 /example/.comments
9 /example/example.atom.xml
8 /example/When/200x/2003/04/10/-big/Concorde.jpg
7 /example/When/200x/2006/03/30/-big/IMG_4613.jpg
6 /example/When/200x/2003/07/25/-big/guild-2.jpg
5 /example/Patti-Smith.png
Run Code Online (Sandbox Code Playgroud)

如何在名称 url 后打印 uniq 编号?并用数字打印

1. /example/.comments - 28
2. /example/example.atom.xml - 9
3. /example/When/200x/2003/04/10/-big/Concorde.jpg - 8
4. /example/When/200x/2006/03/30/-big/IMG_4613.jpg - 7
5. /example/When/200x/2003/07/25/-big/guild-2.jpg - 6
6. /example/Patti-Smith.png - 5
7. /example/IMGP4289-2.png - 5
8. /example/IMGP4287.png - 5
9. /example/Image-Search-Mystery.png - 5
10. /example/Horses.png - 5
11. /example/When/200x/2004/02/27/-big/Unreal.png - 4
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 8

以下awk命令将修改每个输入行,以便将第一个字段复制到新的最后一个字段并以破折号为前缀。然后第一个字段被替换为行号,后跟一个点。

awk '{ $(NF+1) = "-"; $(NF+1) = $1; $1 = NR "."; print }'
Run Code Online (Sandbox Code Playgroud)

因此,将这两个awk调用与sort | uniq -c您的初始管道结合起来,并将其标记到最后:

awk '
    $9 ~ /^40[34]$/ { count[$7]++ }
    END             { for (a in count) print count[a], a }' log.txt |
sort -nr |
awk '{ $(NF+1) = "-"; $(NF+1) = $1; $1 = NR "."; print }'
Run Code Online (Sandbox Code Playgroud)

如果你碰巧有GNU awk(上如Linux系统中常见的),4.0版或更高版本,那么你可以另外做sort -nrawk太:

awk '
    $9 ~ /^40[34]$/ { count[$7]++ }
    END             { 
        PROCINFO["sorted_in"] = "@val_num_desc"
        for (a in count)
            print ++i ".", a, "-", count[a]
    }' log.txt
Run Code Online (Sandbox Code Playgroud)