Awk 将文件拆分为不同的用户并将其管道化到uniq

Awk 将文件拆分为不同的用户并将其管道化到uniq,awk,split,uniq,Awk,Split,Uniq,我有一个文件的格式 用户ID lat-lon时间戳 lat-lon时间戳 用户ID lat-lon时间戳 lat-lon时间戳 lat-lon时间戳 等等 我想分割文件,然后做这类事情 cat data.txt | sort | awk '{print $1" "$2;}' | uniq -c | sort 因此,我可以得到每个用户显示每个唯一位置的次数。在Perl中,这是相对简单的: perl -lnae 'if (scalar(@F) == 1) { $userid = $F[0]; ne

我有一个文件的格式

用户ID

lat-lon时间戳

lat-lon时间戳

用户ID

lat-lon时间戳

lat-lon时间戳

lat-lon时间戳

等等

我想分割文件,然后做这类事情

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

因此,我可以得到每个用户显示每个唯一位置的次数。

在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
好奇的信天翁(又名
user1
user2
)可以在以下位置找到:

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)脚本:

上面的数据文件是
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
$
$sh x19.awk
假设一行少于3列,并且lat和lon数据不包含任何空格,则可以简单地执行以下操作:

awk 'BEGIN{ cmd = "sort | uniq -c" }
  NF < 3 { close cmd; print; next }
  { print $1, $2 | cmd }' input-file
awk'BEGIN{cmd=“sort | uniq-c”}
NF<3{close cmd;print;next}
{打印$1,$2 | cmd}'输入文件
awk 'BEGIN{ cmd = "sort | uniq -c" }
  NF < 3 { close cmd; print; next }
  { print $1, $2 | cmd }' input-file