# AWK Skript



## thieltgj (18. August 2007)

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


----------



## son gohan (18. August 2007)

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.


----------



## deepthroat (18. August 2007)

Hi.

Du hast ein paar Semikola unterschlagen. Versuch's mal so:
	
	
	



```
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 ");
}
```


----------



## thieltgj (19. August 2007)

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!!


----------



## deepthroat (19. August 2007)

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ß


----------



## thieltgj (19. August 2007)

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.


----------



## deepthroat (19. August 2007)

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.


```
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. 

Gruß


----------



## thieltgj (19. August 2007)

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!


----------

