2016-07-22 6 views
0

Ich habe zwei Eingabedateien. Man hat Namelist, mm: dd Formular, Dauer der Nutzung und andere Host-Namen Zeug in jeder Zeile. Der andere ist derjenige, den ich generiert habe und der in jeder Zeile eine Namensliste hat, die sich nicht wiederholt. Ich versuche einen Shell-Befehl zu schreiben, um die Datei mit der Nameliste zu durchlaufen, sie als Variable zu speichern und mit der anderen Datei den Namen zu vergleichen und dann die Gesamtdauer der Benutzung für jede Person auszugeben und dann eine Datei auszugeben, die enthält und Information. Kann ich irgendwie awk oder irgendwas für die Arbeit benutzen?Verwenden Sie Shell, um eine Datei zu durchlaufen

Ich dachte der Befehl: für Wort in $ (Cat Namelist); echo $ word; done aber das ist nur für das Durchlaufen einer Datei. Was ich tun möchte, ist so etwas wie dieses:

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) 

Ich habe bereits die Codes heraus die Verwendung von Zeit zu berechnen. Es ist nur, wie man diese Operation macht, das ist jetzt mein Problem. Könnte jemand bitte helfen?

----------------- weitere Erklärung So habe ich eine Datei mit Informationen über die Zeit, die der Benutzer für die Anmeldung in den Host verbraucht, dass jede Zeile die Informationen hat Name, Datum (mm: TT: hh: mm), Anfangszeit, Endzeit, Zeitdauer und Hostname. Was ich erreichen möchte ist, eine Datei mit jedem Monat als Titel auszugeben (zum Beispiel: [April]) und dann die Zeitdauer jedes Benutzers zu berechnen, der sich am Host anmeldet. Sie können mehrere Logins haben, daher erscheinen ihre Namen mehrmals mit den anderen Informationen in jeder Zeile. Ich habe diese Datei generiert, die alle Benutzernamen enthält, die während des letzten halben Jahres angemeldet wurden. Ich versuche, eine Ausgabedatei mit jedem Monatsnamen als Titel zu erstellen, gruppiere sie nach Monat und vergleiche dann die Namen in der Datei mit der von mir generierten Namensliste, um deren Zeitdauer zu berechnen und in die Ausgabedatei derselben Zeile zu drucken ihr Name wurde gedruckt. Ich habe bereits herausgefunden, wie man die Berechnungen durchführt. So jetzt ist es nur wie kann ich die Schritte passenden Namen zu tun, die mich

Eingabedatei verwirrt:

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 

Beispielausgabe:

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

Ich bin mir nicht sicher, ob ich die Frage verstehe, aber Sie _may_ suchen nach dem [join] (http://linux.die.net/man/1/join) Dienstprogramm. – zwol

+0

Ich untersuche gerade dieses Dienstprogramm. Vielen Dank! Und auch ich habe nur eine weitere Erklärung hinzugefügt – Edccccch

+0

wird viel einfacher zu helfen, wenn Sie ** kleine ** Beispieldaten (3 Spalten Wert klingt wie es sollte genug sein), und erforderliche Ausgabe von diesen Daten. Verwenden Sie das Formatierungswerkzeug '{}' oben links im Bearbeitungsfeld für markierten Text, um es als Code/Daten/Ausgabe/ErrMsgs zu formatieren. Viel Glück. – shellter

Antwort

-1

ich dies mit Perl durch diesen Code gelöst aus was ich von dir verstanden habe frage.

#!/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 FILE:

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 

Hoffnung, das hilft. Ich

+0

Jetzt denke ich, du musst nur Minuten in Stunden umrechnen, wenn es 60 Minuten überschreitet. – AbhiNickz

+1

Warum .... downvote? – AbhiNickz

2

dachte, das war, was man wollte (verwendet GNU awk 4. * für echte multidimensionalen Arrays):

$ 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 

aber die Ausgangsnummern nicht Ihren erwarteten Werten entsprechen:

[Dec] 
sdou 94.xxxhours 
ermartin 1.19hours 

Ich habe viel Zeit damit verbracht, herauszufinden, warum sie anders sind, aber ich kann nicht. Entschuldigung, hoffe das hilft trotzdem.

Verwandte Themen