【问题标题】:Sum up values in first column for all identical strings in the second column对第二列中所有相同的字符串求和第一列中的值
【发布时间】:2016-02-19 22:56:24
【问题描述】:

假设我有以下 2 个文件,其中包含以下条目(编号、IP 和用户代理):

30000 11.11.11.11 Dalvik/2.1.0 Linux
10000 22.22.22.22 GetintentCrawler getintent.com
 5000 33.33.33.33 Mozilla/5.0 X11; Linux i686 AppleWebKit/537.36 KHTML, like Gecko Chrome/43.0.2357.130 Safari/537.36
 3000 44.44.44.44 Mozilla/5.0 Macintosh; Intel Mac OS X 10_6_8 AppleWebKit/534.59.10 KHTML, like Gecko Version/5.1.9 Safari/534.59.10
 1000 55.55.55.55 Dalvik/1.6.0 Linux; U; Android 4.1.2; Orange Yumo Build/OrangeYumo

 6000 44.44.44.44 Mozilla/5.0 Macintosh; Intel Mac OS X 10_6_8 AppleWebKit/534.59.10 KHTML, like Gecko Version/5.1.9 Safari/534.59.10
 3000 33.33.33.33 Mozilla/5.0 X11; Linux i686 AppleWebKit/537.36 KHTML, like Gecko Chrome/43.0.2357.130 Safari/537.36
 2000 11.11.11.11 Dalvik/2.1.0 Linux
  600 55.55.55.55 Dalvik/1.6.0 Linux; U; Android 4.1.2; Orange Yumo Build/OrangeYumo
  500 22.22.22.22 GetintentCrawler getintent.com

我希望能够总结所有相同 IP 的第一列(第二列),同时将所有后续列保留在用户代理中。此外,最终输出应按第一列排序。

所以结果基本上应该是这样的:

32000 11.11.11.11 Dalvik/2.1.0 Linux
10500 22.22.22.22 GetintentCrawler getintent.com
 9000 44.44.44.44 Mozilla/5.0 Macintosh; Intel Mac OS X 10_6_8 AppleWebKit/534.59.10 KHTML, like Gecko Version/5.1.9 Safari/534.59.10
 8000 33.33.33.33 Mozilla/5.0 X11; Linux i686 AppleWebKit/537.36 KHTML, like Gecko Chrome/43.0.2357.130 Safari/537.36
 1600 55.55.55.55 Dalvik/1.6.0 Linux; U; Android 4.1.2; Orange Yumo Build/OrangeYumo

到目前为止,我想出了这个,但我丢失了整个用户代理字符串,我也觉得我把事情复杂化了:

cat file1.txt file2.txt file3.txt | awk '{arr[$2]+=$1;} END {for (i in arr) print i, arr[i]}' | awk '{ print $2" "$1 }' | sort -rn

【问题讨论】:

    标签: linux bash awk


    【解决方案1】:

    你可以使用这个gnu-awk

    awk 'BEGIN{PROCINFO["sorted_in"]="@ind_num_asc"} {
       p=$1; $1=""; a[$0]+=p} END{for (i in a) print a[i] i}' file1 file2
    

    BEGIN{PROCINFO["sorted_in"]="@ind_num_asc"} 用于维护关联数组中键的顺序。

    输出:

    32000 11.11.11.11 Dalvik/2.1.0 Linux
    10500 22.22.22.22 GetintentCrawler getintent.com
    8000 33.33.33.33 Mozilla/5.0 X11; Linux i686 AppleWebKit/537.36 KHTML, like Gecko Chrome/43.0.2357.130 Safari/537.36
    9000 44.44.44.44 Mozilla/5.0 Macintosh; Intel Mac OS X 10_6_8 AppleWebKit/534.59.10 KHTML, like Gecko Version/5.1.9 Safari/534.59.10
    1600 55.55.55.55 Dalvik/1.6.0 Linux; U; Android 4.1.2; Orange Yumo Build/OrangeYumo
    

    【讨论】:

    • 从期望的输出和你的输出来看,你和 OP 对于什么是整个用户代理字符串...有不同的看法
    • 谢谢!对我来说,排序部分不起作用(我在 CentOS 6 上,使用 gawk-3.1.7-10.el6.x86_64)。但是我可以很容易地用一个管道来修复它来排序 -rn。所以我没问题!我将此标记为正确答案。
    • 我可以提一下你的答案有资格获得本周Cat 的无用使用奖,因为你在其中有两个cat 的无用使用?尽管如此... ciao
    • LMAO @gboffi!让这家伙放松一下,这是一个诚实的错误:)
    • @Andy 是你开始了无用的使用的东西......!仅针对普通读者(确保您和 Anubhava 最了解):awk 的一个优点是它为当前文件中的记录总数和记录数保留单独的计数器,但使用 cat ,因此强制awk 读取表单stdin,完全破坏了这种机制。当然这不是你的问题和 Anubhava 的解决方案的问题,但这是每个awk 用户必须清楚的事情。咻
    猜你喜欢
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    相关资源
    最近更新 更多