Awk 将文件拆分为不同的用户并将其管道化到uniq
我有一个文件的格式 用户ID lat-lon时间戳 lat-lon时间戳 用户ID lat-lon时间戳 lat-lon时间戳 lat-lon时间戳 等等 我想分割文件,然后做这类事情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
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