2016-07-29 10 views
-1

Ich habe untersucht, eine Eingabe-TXT-Datei in Unix zu sortieren, aber habe einige Probleme, auf die ich einen Ratschlag erhalten würde.Daten von AWK in ein Array

Product,color,stock 
apple,red,400 
apple,green,400 
apple,yellow,400 
grape,purple,500 
banana,yellow,120 

Sagen Sie dies ist meine Eingabedatei. Es ist nur eine Textdatei, aber ich möchte meine Informationen ein wenig konsolidieren.

ich erste awk Gruppe meine Produkte zusammen wie so verwendet ...

awk -F '[,]' 'NR >= 1 {b[$1];} 

Das bin ich mit dem folgenden verlassen würde, wenn ich es ausgedruckt ...

apple 
grape 
banana 

aber wenn ich wollte andere Informationen wie alle Farben des Produkts in dieser Zeile enthalten, die ich in Probleme lief. Wenn ich wollte, dass die 'b'-Indexdaten in ein anderes Array gehen, wie würde ich das tun (da ich nicht von außerhalb des awk-Codes auf' b 'zugreifen kann)? dachte, das folgende würde funktionieren, aber kein Glück.

awk -F '[,]' 'NR >= 1 {b[$1];}END{for (i in b) productArray+=(b[i])}' 
+2

[bearbeiten] Ihre Frage die erwartete Ausgabe, dass Abtastwerteingang gegeben aufzunehmen. "Ich kann scheinbar nicht von außerhalb des awk codes auf" b "zugreifen - na ja, natürlich können Sie nicht, wann haben Sie jemals auf den Wert einer Variablen zugreifen können, die in einem C oder einem anderen verwendet wird? Programm außerhalb dieses Programms? awk ist keine Shell, es ist ein Werkzeug, das Sie von Shell aufrufen, genau wie ein C-Programm. –

Antwort

0

awk hat wirklich keine solchen verschachtelten Listen. Wenn Sie die Daten wollen in einem anderen Array gehen (das Array j), dann können Sie dies tun:

cat test.txt |awk -F '[,]' 'NR > 1 { b[$1]=$2} END {for (x in b) { j[x]; print x}}'

Wenn Sie in die zweite Spalte wollen in einzigartige Linien zusammengebrochen basierend auf Spalte 1, könnten Sie so etwas tun:

$ cat test.txt |awk -F ',' 'NR > 1 { if ($1 in b) { b[$1] = b[$1] FS $2} else { b[$1]=$2}} END {for (x in b) { print x,": " b[x] }}' apple : red,green,yellow banana : yellow grape : purple

+0

Dieser zweite Code funktioniert super! Etwas unsicher wie es funktioniert. Ich sehe, wie es das "Produkt" überprüft, um zu sehen, ob es bereits in b existiert, aber ich bin unsicher bezüglich der Einzelheiten danach. Vor allem, wo Sie b [$ 1] = $ 2] für das ursprüngliche Produkt haben; Ist das was ich hatte (nur b [$ 1]) nicht korrekt? – user3756215

+1

'b [$ 1] = $ 2' bedeutet, dass die Zeichenkette aus dem zweiten Feld ($ 2) als Wert von' b [$ 1] 'gesetzt wird. 'Produkt Apfel ist rot', auf dem nächsten Datensatz' Produkt Apfel ist rot, grün' usw. –

+0

Google UUOC und 'if ($ 1 in b) {b [$ 1] = b [$ 1] FS $ 2} sonst {b [$ 1 ] = $ 2} 'ist häufiger/idiomatisch geschrieben' b [$ 1] = ($ 1 in b? B [$ 1] FS: "") $ 2'. Wenn Sie '-v OFS = ':'' hinzufügen, wird der Ausdruck am Ende nur 'print x, b [x]'. –