-5

質問のタイトルが質問の概要を完全に説明していませんでした。各行が次の形式のデータ行が多数あるテキスト ファイルがあります。

a、日付、b、c、d、ユーザー名、e、説明

a、b、c、d、および e は何にも使用する必要はありません。

ノート:

  • 日付はこの形式です -> 2013-04-07T22:23:58Z (「T22:23:58Z」は必要ありません)
  • 説明は、ログイン、ログアウト、または拡張のいずれかです
  • ファイル全体で同じユーザー名が複数回表示されます

テキスト ファイルからデータを取得し、その日に延長したユーザーとその回数を出力するコードを作成する必要があります。

テキストファイルの例:

a,2013-04-07T22:23:58Z,b,c,d,ジョン,extend
a,2013-04-07T22:23:51Z,b,c,d,ジョン,ログイン
a,2013-07-07T22:23:51Z,b,c,d,ジョン,extend
a,2013-04-07T22:23:58Z,b,c,d,mark,extend
a,2013-03-07T22:23:51Z,b,c,d,フランク,ログイン
a,2013-07-11T22:23:51Z,b,c,d,ジョン,extend

出力例:

2013 年 4 月 7 日:
ジョン -> 1 エクステンド
マーク -> 1 拡張

2013 年 7 月 7 日:
ジョン -> 1 エクステンド

2013 年 7 月 11 日:
ジョン -> 1 エクステンド

誰かが私に説明してくれますか、それとももっと良い方法でこれを行う方法を教えてくれますか?

4

2 に答える 2

0

本当に必要な言語ではありませんが、ここに awk の解決策があります:)

#!/bin/awk
BEGIN {
  FS=",";
}
/extend/{
    split($2,date,"T");
    dates[date[1],$6]++;
}
END {
  last = ""
  n = asorti(dates, dest)
  for (i = 1; i <= n; i++) {
    split(dest[i], idx, SUBSEP)
    if ( last != idx[1]) {
      last = idx[1]
      print "\n"idx[1]
    }
    print idx[2] " -> " dates[idx[1], idx[2]] " extend"
  }
}
于 2013-05-14T19:00:27.643 に答える
0

必要な言語ではない別のソリューション.. PHP ;)

<?php

$handle = fopen("php://stdin", "r");
$dates = array();

while (!feof($handle)) { 
    $data = explode(',', stream_get_line($handle, 200, "\n"));
    if (trim($data[6])=='extend') {
      @$dates[strstr($data[1], 'T', true)][$data[5]]++;
    }
} 

arsort($dates);

foreach ($dates as $date => $users) {
  echo $date;

  foreach ($users as $user => $times)
    echo "\n$user -> $times extend";

  echo '\n\n';
}

?>

次のようにコンソールで使用します: ./script.php < input.txt

于 2013-05-14T19:26:34.243 に答える