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:
Rohrcat
die.tsv
Datei den Inhalt in dem bekommenawk -F '\t' '{print $1}' *
bricht den Inhalt der Datei durch Lasche nach oben und schiebt den Inhalt der ersten Spalte in das RohrLC_ALL=C sort
nimmt den Inhalt des Rohrs und sortiert sie wie-Werte zu haben, nebeneinander, schiebt dann das in das Rohr zurückLC_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)Schließlich sortiert
LC_ALL=C sort -nr
das Zeug in der Leitung wieder in absteigender Reihenfolge und druckt es dann ausstdout
, 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.
Bitte liefern Sie einen Testfall wie hier definiert: http://StackOverflow.com/Help/Mcve – xaxxon