2016-10-06 5 views
0

Ich habe ein .tsv und ich muss die Häufigkeitsvariablen in einer bestimmten Spalte herausfinden und diese Daten in absteigender Reihenfolge ordnen. Ich führe ein Skript in c aus, das einen Puffer herunterlädt und in einer .tsv Datei mit einem Datumsstempel für einen Namen im selben Verzeichnis wie mein Code speichert. Ich habe dann meinen Terminal öffnen und den folgenden Befehl ausführen, pro this awesome SO answer:Merkwürdiges Speicherverhalten, das TSV behandelt

cat 2016-09-06T10:15:35Z.tsv | awk -F '\t' '{print $1}' * | LC_ALL=C sort | LC_ALL=C uniq -c | LC_ALL=C sort -nr > tst.tsv 

dies durch Rohre zu brechen auseinander, was das bedeutet ist:

  1. cat die .tsv Datei den Inhalt in dem bekommen

    Rohr
  2. awk -F '\t' '{print $1}' * bricht den Inhalt der Datei durch Lasche nach oben und schiebt den Inhalt der ersten Spalte in das Rohr

  3. LC_ALL=C sort nimmt den Inhalt des Rohrs und sortiert sie wie-Werte zu haben, nebeneinander, schiebt dann das in das Rohr zurück

  4. LC_ALL=C uniq -c das Zeug in dem Rohr nimmt und Fakten unserer wie oft jeden Wert tritt auf und schiebt dann das zurück in das Rohr (zB Max 3, wenn der Name Max 3 mal auftaucht)

  5. Schließlich sortiert LC_ALL=C sort -nr das Zeug in der Leitung wieder in absteigender Reihenfolge und druckt es dann aus stdout, die ich in eine Datei pipe.

Hier wird es interessant. Wenn ich all dies im selben Verzeichnis wie der c-Code, der meine .tsv Datei zu starten begann, bekomme ich super verrückte Ergebnisse, die eine Mischung aus meiner tatsächlichen .tsv Datei, einige zufällige verdorbene Müll und der Inhalt der sind c Code, der es an erster Stelle bekam. Hier ein Beispiel:

(count) (Wert)

1  fprintf(f, " %s; out meta qt; rel %s; out meta qt; way %s; out meta qt; >; out meta qt;", box_line, box_line, box_line); 
    1  fclose(f); 
    1  char* out_file = request_osm("cmd_tmp.txt", true); 
    1  bag_delete(lines_of_request); 
    1 
    1 
    1 
    1 

    1 

    1??g? 
    1??g? 
    1? 
    1?LXg$E 

... usw. Nun, wenn Sie in dem nach oben, Sie auch einige korrekten Werten finden, aus den .tsv ich Parsen:

(count) (Wert)

1 312639 
    1 3065411 
    1 3065376 
    1 300459 
    1 2946076 

... etc. und wenn ich bewege meine .tsv in einen eigenen Ordner, und dann cd in diesen Ordner, und führen Sie das gleiche c Command wieder, es funktioniert perfekt.

(count) (Wert)

419362 452999 
115770 136420 
114149 1380953 
72850 93290 
51180 587015 
45833 209668 
31973 64756 
31216 97928 
30586 1812906 

Offensichtlich habe ich eine funktionale Antwort auf mein Problem - einfach die Datei in einem eigenen Ordner abgelegt, bevor es das Parsen. Aber ich denke, dass diese Speicherverfälschung darauf hindeutet, dass es ein größeres Problem geben könnte, das ich jetzt beheben sollte, und ich würde lieber auf den Punkt kommen, dass es mit einem temporären symptomatischen Patch sozusagen den Bach runter geht.

Ich sollte erwähnen, dass mein c-Code manchmal system(cmd) verwendet.

+0

Bitte liefern Sie einen Testfall wie hier definiert: http://StackOverflow.com/Help/Mcve – xaxxon

Antwort

2

Der zweite Befehl ist das Problem:

awk -F '\t' '{print $1}' * 

die Sternchen am Ende sehen? Er teilt awk mit, alle Dateien im aktuellen Verzeichnis zu verarbeiten. Stattdessen möchten Sie nur die Standardeingabe (die Rohrausgabe) verarbeiten.

Entfernen Sie einfach die Sternchen und es sollte funktionieren.

+0

Ahaha Ich bin ein totaler Idiot. Da erinnert mich Stack Overflow immer wieder: D –