2016-07-28 11 views
2

Ich habe Datei mit zwei Spalten. Die erste Spalte ist eine Zeichenfolge, die zweite eine positive Zahl. Wenn das erste Feld (string) keine double-Datei enthält (also das erste Feld für die Datei eindeutig ist), möchte ich diese eindeutige Zeile in (sagen wir mal) result.txt kopieren. Wenn das erste Feld eine doppelte Datei enthält, möchte ich das zweite Feld (Nummer) in diesen doppelten Zeilen subtrahieren. Übrigens, Datei wird maximal ein Duplikat haben, nicht mehr als das. Ich möchte das auch in result.txt speichern. Die Ausgabedatei enthält also alle Zeilen mit eindeutigen Werten für das erste Feld und die Zeilen, in denen das erste Feld doppelt vorhanden ist und der zweite Wert von diesen Duplikaten subtrahiert wird. Dateien sind nicht sortiert. Hier ist Beispiel:Subtrack Felder von doppelten Zeilen

INPUT FILE:

hello 7 
something 8  
hey 9  
hello 8  
something 12  
nathanforyou 23 

Ausgabedatei, die ich brauche (result.txt):

hello 1  
something 4  
hey 9  
nathanforyou 23 

ich keine negativen Zahlen in endend Datei haben kann, so dass ich um kleinere Zahlen von größeren zu subtrahieren. Was habe ich bisher versucht? Alle Arten von Sortierung (Ich finde heraus, wie man nicht duplizierte Zeilen findet und sie in eine separate Datei legt, aber doppelte Subtraktion erstickt), Arrays in awk (Ich habe alle Zeilen im Array gespeichert und mache "for" -Klausel ... Problem ist, dass ich nicht weiß, wie man zweites Feld vom Feldelement holt, das Linie) ist usw. Übrigens ist Problem komplizierter als ich beschrieben habe (ich habe vier Felder, die ersten zwei sind gleich und so weiter), aber an das Ende - es kommt darauf an.

+2

Es ist eine gute Übung, Ihre erwähnten Forschungsbemühungen zusammen mit der Frage zu veröffentlichen! – Inian

+0

Hinweis: Sie können HashMap oder Dictionary verwenden (abhängig von Ihrer gewählten Sprache). Wie auch immer, du solltest es zuerst versuchen und deine Probleme hier stellen. – pms

+0

Ich bemerkte gerade dein 'Übrigens, Problem ist komplizierter, als ich beschrieben habe ....' am Ende deiner Frage. Tu das nicht. Entweder löschen Sie diese Aussage, wenn Sie sicher sind, dass Sie jede Antwort selbst massieren können oder bearbeiten Sie Ihre Frage, um Ihr wirkliches Problem zu zeigen. Veröffentlichen Sie kein Beispiel, das nicht Ihre wirklichen Daten darstellt, und warten Sie dann, bis Sie eine Antwort bekommen, um ein "wie ändere ich das, um mein wirkliches Problem zu behandeln?" Das ist sehr ärgerlich. –

Antwort

1
$ cat tst.awk 
{ val[$1,++cnt[$1]] = $2 } 
END { 
    for (name in cnt) { 
     if (cnt[name] == 1) { 
      print name, val[name,1] 
     } 
     else { 
      val1 = val[name,1] 
      val2 = val[name,2] 
      print name, (val1 > val2 ? val1 - val2 : val2 - val1) 
     } 
    } 
} 

$ awk -f tst.awk file 
hey 9 
hello 1 
nathanforyou 23 
something 4 
+1

Wie immer +1, um es einfach zu machen !, probierte ich selbst 'awk' {a [$ 1] - = $ 2} END {für (i in a) drucke ich, (a [i] <0? -a [i] : a [i])} 'file', für die erste Berechnung wird eine Subtraktion von '0 - ' durchgeführt, was das Ergebnis zunichte macht! – Inian

+1

Ja, du müsstest mit etwas anfangen wie 'a [$ 1] = ($ 1 in a? A [$ 1] - $ 2: $ 2)'. –

+1

Sehr geschätzt Ihren Vorschlag! :) – Inian

Verwandte Themen