• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Script-Aufgabe - wie lange braucht man dafür?

apollo

Newbie
Hallo Forum!

Ich habe hier eine vielleicht etwas komische Aufgabe. Es geht mir jetzt nicht so sehr um die Lösung derselben - die habe ich nämlich schon. Sondern eher um die Anzahl der Minuten oder Stunden, die man mit dem Programmieren/Scriptieren dieser Lösung braucht. Es wäre toll, wenn ein paar Leute diese Aufgabe lösen und gleichzeitig ein paar Angaben zu sich selbst selbst machen würden. Mich würde also interessieren, wie lange ihr mit welcher Scriptsprache an einer Lösung gearbeitet habt, bis das ganze ohne Fehler lief. Es wäre für mich in diesem Zusammenhang besonders wichtig zu wissen, wie lange ihr schon mit dieser Scriptsprache arbeitet und wie ihr eure Erfahrung in diesem Bereich einschätzt.
Wer Lust hat mitzumachen - hier ist die Aufgabe:

Es gibt eine datei adarep.txt, die eine Datenbankstatistik enthält. Ich habe einen Beispiel-Inhalt dieser Datei unten angehänt - er ist etwas länger.
Die Aufgabe ist es nun, diese Datei auszuwerten. Es ist zu prüfen, ob eine Tabelle (oder "File") in dieser Datenbank mehr als 4 Extents hat.
Die Anzahl der Extents findet sich in dem Datenbankreport pro File 4 mal. Nämlich "Extents N", "Extents U", "Extents A", "Extents D". Ist einer dieser vier Werte größer als z.B. 5, soll eine entsprechende Meldung ausgegeben werden. Die Meldung könnte zum Beispiel so aussehen:
"Datei x hat y D-Extents"

Alles klar?

Code:
%ADAREP-I-STARTED,      29-NOV-2005 08:50:10, Version 3.3.1.05 (Linux 32Bit)
%ADAREP-I-DBON, database 82 accessed online
Content of Database 82          29-NOV-2005 08:50:10


                                                  Index   Extents   Pad % flags
File Filename          loaded on        Top ISN   level  N  U  A  D  A  D AISCE
-------------------------------------------------------------------------------
   1 CHECKPOINT-FILE  23-NOV-2005             6       3  1  1  1  1  5  5   S
   2 SECURITY-FILE    23-NOV-2005             0       3  1  1  1  1  5  5  IS
   3 USER-DATA-FILE   23-NOV-2005             0       3  1  1  1  1  5  5  IS
   4 SYSTEM-NCP        5-FEB-2003             0       3  1  1  1  1  3  3   S
  11 FDIC441          26-APR-2005        38,123       5  1  1  1  1  5  5   S
  12 FCST_V4411        7-JUL-2003         5,241       3  2  2  1  1  5  5  IS
  13 FCST_V321_ALT    21-JAN-2003         4,130       3  1  1  1  1  5  5  IS
  62 VERSION          17-AUG-2004             1       3  1  1  1  1  5  5  IS
  66 PERSPLANUNG       4-NOV-2004         3,283       3  5  1  2  2  5  5  IS
  70 TEXT             17-AUG-2004        18,832       3  1  1  1  1  5  5  IS
  71 HMKOPF           17-AUG-2004            25       3  1  1  1  1  5  5  IS
  72 ETIKETT          17-AUG-2004             8       3  1  1  1  1  5  5  IS
  74 INVGROUP          7-JUL-2005             3       3  1  1  1  1  5  5  IS
  75 INVLAGERORT      17-AUG-2004            65       3  1  1  1  1  5  5  IS
  76 INVMENGEN         6-APR-2005             1       3  1  1  1  1  5  5  IS
  77 INVARTIKEL        6-APR-2005             0       3  1  1  1  1  5  5  IS
  78 INVAUFTRAG       17-AUG-2004           359       3  1  1  1  1  5  5  IS
  79 INVPOOL          17-AUG-2004             0       3  1  1  1  1  5  5  IS
  81 WEG              17-AUG-2004         8,990       3  8  1  4  2  5  5  IS
  82 POSITION         17-AUG-2004        75,223       3  7  5  5  1  5  5  IS
  83 ASEN             17-AUG-2004         9,622       3  4  1  1  1  5  5  IS
  84 COLART           17-AUG-2004         4,453       3  2  1  1  1  5  5  IS
  85 FARBE            17-AUG-2004           638       3  2  1  1  1  5  5  IS
  96 VERSSCHADEN      17-AUG-2004           259       3  1  1  1  1  5  5  IS
 100 ARTBEWEGUNGPOS    6-APR-2005             0       3  1  1  1  1  5  5  IS
 102 AUFTRERHA        17-AUG-2004            21       3  1  1  1  1  5  5  IS
 103 BUCHUNGEN         6-APR-2005            16       3  1  1  1  1  5  5  IS
 104 MENGENAENDERUNG   6-APR-2005            57       3  1  1  1  1 10  5  IS
 105 BUCHSCHLSUMMEN   17-AUG-2004        13,192       3  1  1  1  1  5  5  IS
 106 BUCHUNGENZEN     17-AUG-2004             0       3  1  1  1  1  5  5  IS
 108 BUCHSCHLSTATIST  17-AUG-2004           162       3  1  1  1  1  5  5  IS
 109 ARTBEWEGUNGKOPF  17-AUG-2004         1,512       3  1  1  1  1  5  5  IS
 110 ARTORDERKOPF     18-AUG-2004         6,978       3  1  1  1  1  5  5  IS
 111 ARTORDERPOS      18-AUG-2004        61,871       4  1  1  2  3  5  5  IS
 120 STBESTKOPF       17-AUG-2004         1,075       3  1  1  1  1  5  5  IS
 121 STBESTPOS        17-AUG-2004         1,236       3  1  1  1  1  5  5  IS
 160 ZERF-EINZELS     30-SEP-2004             4       3  1  1  1  1  5  5  IS
 161 INF_VD_ARTUMS_A  23-NOV-2005     1,956,277       4  4  4  6  4 10  5  IS


                                Allocated blocks               Unused blocks
File Filename              NI     UI     AC        DS       NI     UI        DS
-------------------------------------------------------------------------------
   1 CHECKPOINT-FILE        1      1      5        16        1      0        15
   2 SECURITY-FILE          2      2      1         3        2      1         2
   3 USER-DATA-FILE        24      2      5        29       24      1        28
   4 SYSTEM-NCP           140     10      8       500      140      9       499
  11 FDIC441            11812    706     88      1500     2437     93       402
  12 FCST_V4411           193     45      8       450       10      7       247
  13 FCST_V321_ALT        140     40      8       450        1      3       236
  62 VERSION               60     13      3        50       56      8        49
  66 PERSPLANUNG          141     12     10        28       27      4         8
  70 TEXT                 500     25     44      3000      309     20      1440
  71 HMKOPF                10      5      3        50        6      0        49
  72 ETIKETT              150     13      3        50      146      8        49
  74 INVGROUP             202     17     10       200      200     14       199
  75 INVLAGERORT           30     20      1        30       28     17        29
  76 INVMENGEN            309     33     15       200      305     28       199
  77 INVARTIKEL          3000     50    147       800     3000     48       799
  78 INVAUFTRAG            50     12      3       100       45      8        96
  79 INVPOOL               50     14      8        80       50     13        79
  81 WEG                  255     13     14        60        7      7        19
  82 POSITION            3480     67    113       562       79     12        36
  83 ASEN                 640     15     15       150       32      0        72
  84 COLART               300     30     12        50       88     19        20
  85 FARBE                 45     12      2        10        6      5         5
  96 VERSSCHADEN          250     25     15       250      235     16       247
 100 ARTBEWEGUNGPOS       400     21     22       200      400     19       199
 102 AUFTRERHA             30     12      2        40       29     10        39
 103 BUCHUNGEN           6000     90    367      2500     5992     81      2499
 104 MENGENAENDERUNG    35000    800   1027      5500    34992    791      5499
 105 BUCHSCHLSUMMEN       500     30     22       100       76     21        33
 106 BUCHUNGENZEN          20     10      1        20       20      9        19
 108 BUCHSCHLSTATIST       20     10      2        20       16      6        17
 109 ARTBEWEGUNGKOPF      100     20      3       100       46     13        85
 110 ARTORDERKOPF         200     30     12       200       88     26       135
 111 ARTORDERPOS         5000    122    100       857      272     45        87
 120 STBESTKOPF           100     24      8       100       69     17        90
 121 STBESTPOS            600     30     22       250      533     19       215
 160 ZERF-EINZELS        4000    107    294      1400     3997    103      1399
 161 INF_VD_ARTUMS_A    62366   1347   3486     22761      566      4      1057
-------------------------------------------------------------------------------
     Total             262541   7136  10168     78528   151809   4145     43788



%ADAREP-I-TERMINATED,   29-NOV-2005 08:50:10, elapsed time: 00:00:00
 

TeXpert

Guru
apollo schrieb:
Hallo Forum!

Ich habe hier eine vielleicht etwas komische Aufgabe. Es geht mir jetzt nicht so sehr um die Lösung derselben - die habe ich nämlich schon. Sondern eher um die Anzahl der Minuten oder Stunden, die man mit dem Programmieren/Scriptieren dieser Lösung braucht.

das ist in sofern schwer einzuschätzen, da man hier ja mit einem minimalen Beispiel konfrontiert wird... aber prinzipiell ist das eine typische Perl oder awk-Aufgabe. Wenn Dein Beispiel allgemeingültig ist, brauchst Du nur die erste Liste, also finde den ersten Block (getrennt von dem ----------------) und arbeite bis zur 1. Leerzeile...

das ist ein 2-Minuten-Awk :

Code:
# Flag deklarieren
BEGIN {doit=0;}

# starte mit --------------- -Zeile
/----------/ {
  if (doit==0) {
    # lesen bis leerzeile
    getline;
    while ($0 != "")
    {
      # N
      if ($6>5) print "Datei ", $2, " hat ", $6, " N-Extends"
      # U
      if ($7>5) print "Datei ", $2, " hat ", $7, " U-Extends"
      # A
      if ($8>5) print "Datei ", $2, " hat ", $8, " A-Extends"
      # D
      if ($9>5) print "Datei ", $2, " hat ", $9, " D-Extends"
      getline;
    };
    # 2. block ignorieren -> flag setzen.
    if ($0 == "") doit = 1;
  } 
}

und wenn ich bei einer Tasse Kaffee noch mal drüber nachdenke kommt das raus:

Code:
(NF==12) && ($6>5) { print "Datei ", $2, " hat ", $6, " N-Extends" }
(NF==12) && ($7>5) { print "Datei ", $2, " hat ", $7, " U-Extends" }
(NF==12) && ($8>5) { print "Datei ", $2, " hat ", $8, " A-Extends" }
(NF==12) && ($9>5) { print "Datei ", $2, " hat ", $9, " D-Extends" }

dabei gehe ich natürlich davon aus, dass dein Sample allgemeingültig ist :) insbesondere die Anzahl der Spalten in anderen Bereichen nicht denen im gesuchten Bereich entsprechen.
 
OP
A

apollo

Newbie
TeXpert schrieb:
Wenn Dein Beispiel allgemeingültig ist,
Ja, es ist allgemeingültig.
TeXpert schrieb:
das ist ein 2-Minuten-Awk :
Danke für deine Mühe. Ich würde dich (auch in Anbetracht deiner bisherigen Posts) als erfahrenen User einstufen. Also kein Problem für dich...

Ich würde mich freuen, wenn sich noch mehr melden würden...

Ich habe übrigens ein 7-Minuten-Bash geschrieben.
 

oc2pus

Ultimate Guru
also, ich habe 15 Sekunden gebraucht:
cut & copy von TeXpert Script && chmod +x script

c010.gif




p.s. man muss nix wissen, nur einen kennen der es kann ....
 
Code:
awk ' { if (!(int($1)==0||OLD>int($1))){print "Datei ",$2," hat ",$6," N-Extends",$7," U-Extends",$8," A-Extends",$9," D-Extends"; OLD=int($1)}}'

Dürfen 5 Minuteneinzeiler auch mitmachen ?

Haveaniceday

Edit: OOps, Old nicht gesetzt. +2 Minuten Maintenance ;-)
 
Code:
awk ' { if (!(int($1)==0||OLD>int($1))){OLD=int($1); if($6>4 || $7>4 || $8>4||$9>4) print "Datei ",$2," hat ",$6," N-Extends",$7," U-Extends",$8," A-Extends",$9," D-Extends"; }}'

Jetzt ist es kein Einzeiler mehr. Das Bord bricht vorher um...
Haveaniceday
 
OP
A

apollo

Newbie
Danke ihr zwei!
Hier ist übrigens noch mein bash:
Code:
#!/bin/bash

max_ext=4

cat adarep.txt | tail +9 |
while read file name date isn index ext_n ext_u ext_a ext_d pad_a pad_d rest
do
  if [ "$file" = "" ]
  then
    break
  fi
  if [ "$ext_n" -gt "$max_ext" ]
  then
    printf "File %+3s %-32s has %+2s extents on NI\n" "$file" "$name" "$ext_n"
  fi
  if [ "$ext_u" -gt "$max_ext" ]
  then
    printf "File %+3s %-32s has %+2s extents on UI\n" "$file" "$name" "$ext_u"
  fi
  if [ "$ext_a" -gt "$max_ext" ]
  then
    printf "File %+3s %-32s has %+2s extents on AC\n" "$file" "$name" "$ext_a"
  fi
  if [ "$ext_d" -gt "$max_ext" ]
  then
    printf "File %+3s %-32s has %+2s extents on DS\n" "$file" "$name" "$ext_d"
  fi
done
 

regexer

Advanced Hacker
apollo schrieb:
Danke ihr zwei!
Hier ist übrigens noch mein bash:
Um die Kollektion vollständig zu machen: Ein 12-Minuten-Perl, wobei ich die meiste Zeit damit zubrachte, Bytes zu zählen. Die Ausgabe orientiert sich am Bash-Script.
Code:
#!/usr/bin/perl

use strict;

my $max_ext=$ARGV[0];
$max_ext=4 if ($max_ext == 0);

open (ADAREP, "<adarep.txt") || die "adarep.txt: $!\n";
while (<ADAREP>) {
  next if ($. < 9);
  last if (/^\s*$/);
  my ($file, $name, $ext_n, $ext_u, $ext_a, $ext_d) =
     (unpack "A5A17A11A14A8A3A3A3A3A*", $_)[0,1,5..8];
  if ($ext_n > $max_ext) {
    printf "FILE %+3s %-17s has %-2s extents on NI\n",$file,$name,$ext_n;
  }
  if ($ext_u > $max_ext) {
    printf "FILE %+3s %-17s has %-2s extents on UI\n",$file,$name,$ext_u;
  }
  if ($ext_a > $max_ext) {
    printf "FILE %+3s %-17s has %-2s extents on AC\n",$file,$name,$ext_a;
  }
  if ($ext_d > $max_ext) {
    printf "FILE %+3s %-17s has %-2s extents on DS\n",$file,$name,$ext_d;
  }
}
close ADAREP;
 

TeXpert

Guru
4077 schrieb:
TeXpert schrieb:
das ist ein 2-Minuten-Awk :

Code:
      if ($6>5) print "Datei ", $2, " hat ", $6, " N-Extends"
Mit der Änderung, daß die if-Bedingung(en) entweder >4 oder >=5 heißen muß/ müssen ;-)

4077
stümmt :) ups gilt selbst nach Kaffee-Konsum natürlich immer noch ;)
Code:
(NF==12) && ($6>4) { print "Datei ", $2, " hat ", $6, " N-Extends" }


und den 1-Zeiler von haveaniceday können wir mit dem Wissen um die konstante Struktur auch von dem Old befreien :)
Code:
awk ' {if(NF==12 && ($6>4 || $7>4 || $8>4||$9>4)) print "Datei ",$2," hat ",$6," N-Extends",$7," U-Extends",$8," A-Extends",$9," D-Extends"; }'

notoxp schrieb:
Code:
 my ($file, $name, $ext_n, $ext_u, $ext_a, $ext_d) =
     (unpack "A5A17A11A14A8A3A3A3A3A*", $_)[0,1,5..8];
gibts einen Grund, warum Du das mit unpack machst? bei Text-Files würde ich das eher so machen:
Code:
my @temp=split;  
my ($file, $name, $ext_n, $ext_u, $ext_a, $ext_d) = @temp[0,1,5..8];
[/code]
 

regexer

Advanced Hacker
TeXpert schrieb:
gibts einen Grund, warum Du das mit unpack machst? bei Text-Files würde ich das eher so machen:
Code:
my @temp=split;  
my ($file, $name, $ext_n, $ext_u, $ext_a, $ext_d) = @temp[0,1,5..8];
Im Fall des Beispieles führen viele Wege nach Rom. Aber wir haben ja schon beim Thema "ls -l" drüber geredet: Irgendwo ein space zuviel im Dateinamen, und schon klappt es nicht mehr. Das mit dem unpack war als zeichenorientierte Alternative gedacht.
Im übrigen kannst du dir bei deiner Lösung das @temp sparen. ;-)
 

TeXpert

Guru
notoxp schrieb:
Im übrigen kannst du dir bei deiner Lösung das @temp sparen. ;-)

ich weiß, ich weiß, meine große Schwäche... ich ich schwafel in perl noch ein wenig ;) ich bin da wohl zusehr ein Anhänger des literate Programming.... lieber einen eindeutig lesbaren Code und 20 Zeichen verschwenden als 5 Operatoren in einer Aktion ....
 
Oben