0

私はフォーマットのファイルを持っています

ユーザーID

緯度経度タイムスタンプ

緯度経度タイムスタンプ

ユーザーID

緯度経度タイムスタンプ

緯度経度タイムスタンプ

緯度経度タイムスタンプ

そして、ファイルを分割してから、この種のことをしたい

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

そのため、ユーザーごとにそれぞれの固有の場所が表示される回数を取得できます。

4

2 に答える 2

0

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
$
于 2013-10-22T05:01:07.957 に答える
0

行が 3 列未満の場合にユーザー ID であり、緯度と経度のデータに空白が含まれていないと仮定すると、次のように簡単に実行できます。

awk 'BEGIN{ cmd = "sort | uniq -c" }
  NF < 3 { close cmd; print; next }
  { print $1, $2 | cmd }' input-file
于 2013-10-22T05:12:31.970 に答える