AWK Skript

thieltgj

Grünschnabel
Hallo!

Ich schreibe gerade an meiner Diplomarbeit und bräuchte eure Hilfe:

Ich möchte aus einer Textdatei verschiedene Werte ausgeben lassen:

{ FS = OFS = "\t"
}
{
print( $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $15, $21, $23, $24, $25, $26)
}

und anschliessend von einigen nominal skalierten Werten ein Ergebniswert:

{ergebnis = $13 + $16 + $17 + $18 + $20 + $22;
if (ergebnis > 0)
print(" 1 ")
else
print(" 0 ")
}


Leider klappt nur der erste Programmteil..
Kann mir jemand bitte helfen?
Wäre euch sehr dankbar

Viele Grüße
Judith
 
Hi,
eine Loesung habe ich zwar nicht aber dafuer ein vielleicht hilfreichen Tipp, erwaehn doch mal um welche Programiersprache es geht und vielleicht weis dann auch jemand bescheid, also zumindest fuer mich sah es so aus als ob da niccht bei steht um welche Sprache es sich handelt.
 
Hi.

Du hast ein paar Semikola unterschlagen. Versuch's mal so:
Code:
BEGIN {
  FS = OFS = "\t";
}

{
  print( $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $15, $21, $23, $24, $25, $26);
    
  ergebnis = $13 + $16 + $17 + $18 + $20 + $22;
  
  if (ergebnis > 0) 
    print(" 1 ");
  else
    print(" 0 ");
}
 
Dankeschön!!

Leider klappt es immer noch nicht ganz... Ich habe das Programm nochmal etwas abgeändert....

In der ersten Zeile sollen die Werte so übernommen werden wie sie da stehen (nur eine Variable soll zusätzlich übernommen werden: Design_flag):

{
FS = OFS = "\t";
}

{
for(i=1; i<2;i++)
print( $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $15, $21, "design_flag", $23, $24, $25, $26, " ");


Dann soll aus der 2.ten Zeile erster Wert, zweiter,... ausgegeben werden (hier werden allerdings nochmal aus der ersten Zeile diesselben werte wie oben entnommen... Warum):

print( $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11);

if ($12 == "N")
$12 = " 0 ";
else
$12 = " 1 ";

if ($15 == "N")
$15 = "0 ";
else
$15 = "1 ";

if ($21 == "N")
$21 = "0 ";
else
$21 = "1 ";

print($12, $15, $21);


Dann das Ergebnis folgender Berechnung (unter "Design_flag"):

if ($13 == "Y" ||$16 == "Y"||$17 == "Y"||$18 == "Y"||$20 == "Y"||$22 == "Y")
print("1 ");
else
print("0 ");


und dann die letzten Werte der Zeile:

print( $23, $24, $25, $26, " ");
}


Bis auf die Frage warum dann nochmal die Werte aus der ersten anstatt aus der zweiten Zeile entnommen wurden, scheint das Programm die Werte richtig auszugeben...

Allerdings erscheint die Darstellung wenn ich die Datei mit SPSS öffne völlig falsch...
Bis zum $11 übernimmt er die ersten Werte als Variablennamen, die darauf folgenden werden schon als Variablenwerte dargestellt? Obwohl die Variablenbeschriftung in der ersten Zeile natürlich auch bis $26 geht...

Vielleicht hat von euch jemand eine Idee?

Grüße,
Judith

P.S. Es handelt sich um die Programmiersprache AWK!!
 
Hi.

Also irgendwie versteh ich deine Beschreibung nicht so ganz. Kannst du nicht mal einfach ein (minimales) Beispiel machen, wo du 1. das veränderte Skript postest (und bitte mit Code-Tags!), 2. die Eingabe, 3. die Ausgabe und 4. was du erwartet hättest.

Gruß
 
Also Eingabe:

auct_id item_leaf_category_name listing_title listing_subtitle listing_start_date listing_end_date listing_durtn_days listing_type_code feedback_score_at_listing_time start_price buy_it_now_price buy_it_now_listed_flag bold_fee_flag featured_fee_flag category_featured_fee_flag gallery_fee_flag gallery_featured_fee_flag ipix_featured_fee_flag reserve_fee_flag highlight_fee_flag schedule_fee_flag border_fee_flag qty_available_per_listing gms category_avg_gms gms_greater_avg
00001 Audio & Hi-Fi:MP3-Player:Apple iPod:iPod Mini 4 GB:Silber Apple iPod mini 4 GB 2. Gen. 2005 silber blau pink grün 06/24/2005 11/03/2005 132 7 2182 195.00 0.00 N N N N Y N N N N N N 48 195.00 167.977 1
00003 Audio & Hi-Fi:MP3-Player:Apple iPod:iPod Mini 4 GB:Silber APPLE iPod mini Musicplayer 4GB Mac/Win USB 2.0 silber 08/13/2005 10/11/2005 59 7 10604 185.00 0.00 N N N N N N N N N N N 2 185.00 167.977 1
00004 Audio & Hi-Fi:MP3-Player:Apple iPod:iPod Mini 4 GB:Silber Apple iPOD Mini Silber NEUWARE mit Rechnung/Garantie 09/08/2005 10/23/2005 45 7 72 195.00 0.00 N N N N Y N N N N N N 2 195.00 167.977 1


Die ersten Werte sind die Variablenbezeichnung, danach kommen die Variablenwerte...
Von denen die Y/N kodiert sind, gebe ich 3 Stück in 0/1 Kodierung aus, die anderen fasse ich zusammen zum "Design_flag". Alle anderen Werte (die metrischen) gebe ich unverändert aus.

Nach meinem Programm (s. in meinem oberen Beitrag) bekomme ich folgendes als Ausgabe:


auct_id item_leaf_category_name listing_title listing_subtitle listing_start_date listing_end_date listing_durtn_days listing_type_code feedback_score_at_listing_time start_price buy_it_now_price
buy_it_now_listed_flag category_featured_fee_flag schedule_fee_flag
design_flag qty_available_per_listing gms category_avg_gms gms_greater_avg
00001 Audio & Hi-Fi:MP3-Player:Apple iPod:iPod Mini 4 GB:Silber Apple iPod mini 4 GB 2. Gen. 2005 silber blau pink grün 06/24/2005 11/03/2005 132 7 2182 195.00 0.00
0 0 0
1
48 195.00 167.977 1
00003 Audio & Hi-Fi:MP3-Player:Apple iPod:iPod Mini 4 GB:Silber APPLE iPod mini Musicplayer 4GB Mac/Win USB 2.0 silber 08/13/2005 10/11/2005 59 7 10604 185.00 0.00
0 0 0
0
2 185.00 167.977 1

Das Problem ist dass die Variablenbezeichnungen ab Design_flag anders ausgegeben werden. Bzw. das Programm SPSS erkennt diese schon als Variablenwerte, die sich daran anschließen. Und meine berechneten Werte werden nicht in den korrekten Zeilen ausgegeben, dazwischen bleiben Zellen leer oder sie werden eine Zeile tiefer ausgegeben.
Ein Fall müsste praktisch auch in einer einzigen Zeile ausgegen werden um als zusammenhängender Fall erkannt zu werden!

Die Darstellung in SPSS s. Anhang.
 

Anhänge

  • meine Ausgabe in SPSS.doc
    138,5 KB · Aufrufe: 39
  • korrekte Ausgabe in SPSS.pdf
    174,2 KB · Aufrufe: 46
Bitte benutze Code-Tags für eingebettete Programmtext o.ä.

Also ich vermute von deiner Beschreibung (geht's nicht etwas genauer :) ?), dass in der ersten Zeile die Spaltenbezeichnungen stehen. Dann müßtest du allerdings die erste Zeile anders verarbeiten als die anderen Zeilen.

Code:
BEGIN { FS = OFS = "\t"; }

NR == 1 { /* erste Zeile */ ... }

NR > 1 { /* andere Zeilen */ }

for(i=1; i<2;i++)
print( $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $15, $21, "design_flag", $23, $24, $25, $26, " ");
Die Schleife ist ziemlich unsinnig, da sie immer nur einmal durchlaufen wird.

Es könnte nicht schaden mal einen Blick ins AWK Handbuch bzw. die info Seiten zu werfen. :google:

Gruß
 
Danke!
Ja, genau die Schleife sollte nur einmal durchlaufen werden da es nur für die erste Spalte gelten soll..
Dein Code ist da natürlich viel besser!
Ich werde es gleich mal ausprobieren!
 

Neue Beiträge

Zurück