私はフォーマットのファイルを持っています
ユーザーID
緯度経度タイムスタンプ
緯度経度タイムスタンプ
ユーザーID
緯度経度タイムスタンプ
緯度経度タイムスタンプ
緯度経度タイムスタンプ
等
そして、ファイルを分割してから、この種のことをしたい
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
に (シェル) スクリプトが含まれている場合:
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
場合、このシェル コマンドは次の出力を生成します。
$ 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
$
行が 3 列未満の場合にユーザー ID であり、緯度と経度のデータに空白が含まれていないと仮定すると、次のように簡単に実行できます。
awk 'BEGIN{ cmd = "sort | uniq -c" }
NF < 3 { close cmd; print; next }
{ print $1, $2 | cmd }' input-file