2016-07-22 8 views
0

2つの入力ファイルがあります。 1つは、ネームリスト、mm:dd形式、使用期間、および各行の他のホスト名のものです。もう一つは私が生成したもので、各行には反復しないネームリストがあります。 シェルコマンドを記述して、名前リストでファイルを繰り返し処理し、変数として保存し、名前に一致するように他のファイルをチェックしてから、各人物の合計使用時間を出力し、および情報。とにかくawkや何かを使って作業をすることができますか?シェルを使用してファイルを反復する

私は次のコマンドを考え出しました。 for $(cat namelist); do echo $ word; done これは1つのファイルを繰り返し処理するためのものです。私はすでに時間の使用量を計算するためのコードを考え出した

for word in namelist.txt: 
for words in info_file.txt (field $1): 
    if word == words: 
    (calculating usage of time) 
    print(word, ':', usage of time) 

:私はしたい何 はこのようなものです。それは今私の問題であるこの操作を行う方法です。誰でも助けてくれますか?

-----------------詳しい説明 私は、ユーザーが各行に情報を持っているホストにログインするのに費やした時間の情報を含む1つのファイルを持っています名前、日付(mm:dd:hh:mm)、初期時間、終了時間、継続時間、およびホスト名。 私が達成したいのは、毎月のファイルをタイトルとして出力することです(例:[April])。そして、ホストにログインする各ユーザーの時間を計算します。複数のログインがあるため、名前が複数回表示され、各行に他の情報が表示されます。私はこのファイルを生成しました。このファイルには、過去半年の間にログインしたすべてのユーザー名が含まれています。私は毎月の名前をタイトルとして出力ファイルを生成し、月ごとにグループ化し、ファイルの名前を、生成した名前リストと一致させて、その時間を計算し、同じ行の出力ファイルに出力しようとしています。彼らの名前が印刷されました。私はすでに計算方法を考え出しています。

sdou  pts/11  Thu Dec 10 05:24 - 12:11 (2+06:46) 131.243.186.99 
sdou  pts/10  Thu Dec 10 05:04 - 12:11 (2+07:06) 131.243.186.99 
sdou  pts/9  Thu Dec 10 03:26 - 12:11 (2+08:45) 131.243.186.99 
ermartin pts/0  Sat Dec 12 12:37 - 13:44 (01:06)  c-24-130-14-154.hsd1.ca.comcast.net 
ermartin pts/0  Sat Dec 12 12:18 - 12:31 (00:13)  c-24-130-14-154.hsd1.ca.comcast.net 

サンプル出力::私がこのコードを使用してこのPerlを解決

[Dec] 
sdou 94.xxxhours 
ermartin 1.19hours 
+0

私は質問を理解しているかどうかはわかりませんが、あなたは[join](http://linux.die.net/man/1/join)ユーティリティを探しているかもしれません。 – zwol

+0

私は今このユーティリティを探しています。ありがとう!また、さらに詳しい説明を追加しました。 – Edccccch

+0

は、** small **のサンプルデータ(十分なはずの3列分の音量)と、そのデータからの必要な出力を含めると、はるかに簡単に手助けすることができます。強調表示されたテキストの編集ボックスの左上にある '{}'形式のツールを使用して、code/data/output/ErrMsgsとしてフォーマットします。がんばろう。 – shellter

答えて

-1

だから、今、それは私が私に

入力ファイルを混乱させる一致する名前のステップを行うのですかだけですあなたから私が理解したことは疑問です。

#!/usr/bin/perl -w 
use strict; 
use warnings; 

use Data::Dumper; # $fields[3] => Month $fields[0] => user $fields[8] => Time 

my $user_time = {}; 
my $time = {}; 
open my $READ , '<', 'test' or die; 

while(my $line = <$READ>){ 
    my @fields = split(' ', $line); 

    my $user = $fields[0]; 
    my $month = $fields[3]; 

    $fields[8] =~ m/([\d]*)\+?([\d]{2}):([\d]{2})/; #time format 
    my $min = $3; 
    my $hr = $2; 
    my $day = $1; 
    $day = 0 if (!$day); 
    if (!exists $user_time->{$month}->{$user}){ 
     $time = {}; 
    } 
    $time->{'day'} += $day*24; 
    $time->{'hr'} += $hr; 
    $time->{'min'} += $min; 

    $user_time->{$month}->{$user} = $time; 
} 
close $READ; 
foreach my $month (keys %$user_time){ 
    print "[$month]\n"; 
    my $user_hash = $user_time->{$month}; 
    foreach my $user (keys %$user_hash){ 
     my $time = $user_hash->{$user}; 
     print "$user\t". $time->{'day'}.'.'.$time->{'hr'}.'.'.$time->{'min'}."hours\n"; 
    } 
} 

INPUTファイル:

sdou  pts/11  Thu Dec 10 05:24 - 12:11 (2+06:46) 131.243.186.99 
sdou  pts/10  Thu Dec 10 05:04 - 12:11 (2+07:06) 131.243.186.99 
sdou  pts/9  Thu Dec 10 03:26 - 12:11 (2+08:45) 131.243.186.99 
ermartin pts/0  Sat Dec 12 12:37 - 13:44 (01:06)  c-24-130-14-154.hsd1.ca.comcast.net 
ermartin pts/0  Sat Dec 12 12:18 - 12:31 (00:13)  c-24-130-14-154.hsd1.ca.comcast.net 

OUTPUT:

[Dec] 
ermartin 0.1.19hours 
sdou  144.21.97hours 

この情報がお役に立てば幸いです。

+0

これは、60分を超えると分単位で変換する必要があると思います。 – AbhiNickz

+1

なぜ....?downvote? – AbhiNickz

2

私は、これはあなたが(GNUの真の多次元配列のため4. *をawkを使用しています)何を望むかと思った:

$ cat tst.awk 
{ 
    n = split($9,t,/[()+:]/) 
    hours = t[n-3]*24 + t[n-2] + t[n-1]/60 
    tot[$4][$1] += hours 
} 
END { 
    for (month in tot) { 
     print "["month"]" 
     for (user in tot[month]) { 
      print user, tot[month][user] "hours" 
     } 
    } 
} 

$ awk -f tst.awk file 
[Dec] 
sdou 166.617hours 
ermartin 1.31667hours 

が、出力番号は、あなたの期待値と一致しない:

[Dec] 
sdou 94.xxxhours 
ermartin 1.19hours 

私は彼らがなぜ違うのか理解しようと多くの時間を費やしましたが、できません。申し訳ありませんが、これはとにかく助けて欲しいです

関連する問題