【问题标题】:splitting a file into different users and piping that into uniq将文件拆分为不同的用户并将其通过管道传输到 uniq
【发布时间】:2013-10-30 17:32:57
【问题描述】:

我有一个格式的文件

用户名

经纬度时间戳

经纬度时间戳

用户名

经纬度时间戳

经纬度时间戳

经纬度时间戳

等等

我想拆分文件然后做这种事情

cat data.txt | sort | awk '{print $1" "$2;}' | uniq -c | sort

所以我可以获得每个用户的每个唯一位置出现的次数。

【问题讨论】:

    标签: awk split uniq


    【解决方案1】:

    在 Perl 中相对简单:

    perl -lnae 'if (scalar(@F) == 1) { $userid = $F[0]; next; }
                $sum{$userid}->{"$F[0] $F[1]"}++;
                END { foreach my $userid (sort keys %sum)
                      {
                          foreach my $posn (sort keys %{$sum{$userid}})
                          {
                                   printf "%-15s %-15s  %3d\n", $userid, $posn, $sum{$userid}{$posn};
                          }
                      }
                    }'
    

    给定一个输入文件:

    user1
    23.42 39.11 2013-01-01T00:00:00-00:00
    23.52 39.61 2013-01-02T00:00:00-00:00
    23.42 39.11 2013-01-03T00:00:00-00:00
    user2
    53.42 29.11 2013-01-01T00:00:00-00:00
    43.52 19.61 2013-01-02T00:00:00-00:00
    23.42 39.11 2013-01-03T00:00:00-00:00
    43.52 19.61 2013-01-04T00:00:00-00:00
    43.52 19.61 2013-01-05T00:00:00-00:00
    

    奇怪的信天翁(又名user1user2)可以在以下位置找到:

    user1           23.42 39.11        2
    user1           23.52 39.61        1
    user2           23.42 39.11        1
    user2           43.52 19.61        3
    user2           53.42 29.11        1
    

    awk 中处理它并不那么直接;尤其是在awk中完成排序会很痛苦,所以会推迟到sort程序中:

    如果文件x19.awk 包含(shell)脚本:

    awk 'BEGIN   { SUBSEP = "\t" }
         NF == 1 { userid = $1; next; }
                 { count[userid, $1, $2]++; }
         END     { for (i in count) print i "\t" count[i]; }'
    

    上面的数据文件是x19.data,那么这个shell命令会产生如下输出:

    $ sh x19.awk < x19.data | sort -k1,1 -k2,2n -k3,3n | pr -e4 -l1 -t
    user1   23.42   39.11   2
    user1   23.52   39.61   1
    user2   23.42   39.11   1
    user2   43.52   19.61   3
    user2   53.42   29.11   1
    $
    

    【讨论】:

      【解决方案2】:

      假设一行少于 3 列是用户 ID,并且您的 lat 和 lon 数据不包含任何空格,您可以简单地这样做:

      awk 'BEGIN{ cmd = "sort | uniq -c" }
        NF < 3 { close cmd; print; next }
        { print $1, $2 | cmd }' input-file
      

      【讨论】:

        猜你喜欢
        • 2016-02-26
        • 1970-01-01
        • 1970-01-01
        • 2016-06-11
        • 1970-01-01
        • 1970-01-01
        • 2019-01-24
        • 2015-02-18
        • 1970-01-01
        相关资源
        最近更新 更多