2016-05-13 8 views
0

führe ich einige Verzeichnisse und Dateien, die wie folgt aussieht:Wie kann ich habe eine Katze mit mehreren Rohren rekursiv

/my/directories/directory0/ | -->File1.txt | -->File2.txt /my/directories/directory1/ | -->File1.txt | -->File2.txt /my/directories/directory2/ | -->File1.txt | -->File2.txt /my/directories/directory3/ | -->File1.txt | -->File2.txt

Dies sind CSV-Dateien, und ich versuche, die dritte Spalte gezählt zu bekommen, und sortiert vom höchsten zum niedrigsten.

Momentan kann ich dies erreichen, aber nur innerhalb jedes Verzeichnisses spezifisch. Zum Beispiel, wenn ich diese laufen:

cd /my/directories/directory0/ cat *.txt | awk -F "," '{print $3}' | sort | uniq -c | sort -nr > finalOutput.txt

Dann bekomme ich genau das, was ich will, aber nur mit den Daten in diesem Verzeichnis. Ich möchte alles aus allen/my/directories/Unterverzeichnissen in eine einzige Datei katalysieren.

Ich habe versucht, ls oder find zu verwenden, um dies zu erreichen, aber ich kann es nicht funktionieren. Ich weiß, Sie können rekursiv Katze auf diese Weise, ähnlich wie diese:

find /my/directories/ -name '*.txt' -exec cat {} \; > finalOutput.txt

Aber ich habe dies mit einem Mehr Kommando über arbeiten nicht in der Lage zu bekommen. Jede Hilfe wird geschätzt.

+1

Was ist los mit 'finden/my/Verzeichnisse/-name '* .txt' exec cat {} \; | awk ... '? –

+0

Es ist nichts falsch daran. Ich kannte einfach nicht die korrekte Syntax nach dem -exec-Flag. Dies ist eine gültige Antwort, weil es den Fehler in meiner Syntax zeigt. – trueCamelType

Antwort

1

mit xargs Versuchen:

$ find . -name "f?" | xargs awk -F, '{ print $3 }' | sort | uniq -c | sort -nr 
4 3 
1 z 
1 three 
1 c 
1 5 

$ find . -name "f?" -exec echo "File: " {} \; -exec cat {} \; -exec echo "----" \; 
File: ./d0/f1 
1,2,3 
---- 
File: ./d0/f2 
3,4,5 
---- 
File: ./d1/f1 
8,9,3 
---- 
File: ./d1/f2 
a,b,c 
---- 
File: ./d2/f1 
x,y,z 
---- 
File: ./d2/f2 
one,two,three 
---- 
File: ./d3/f1 
red,yellow,3 
---- 
File: ./d3/f2 
1,2,3 
---- 
+0

Das funktioniert. Ich möchte auch auf jemanden hinweisen, der diese Antwort findet, dass William Purpells Kommentar zu meiner ursprünglichen Frage auch das Problem löst, aber indem er meinen ursprünglichen Versuch behebt. – trueCamelType

1
find . -name "File*" | xargs cut -d, -f3 | sort | uniq -c | sort -nr 
+0

Dies gibt nur eine Spalte zurück und zählt nicht. – trueCamelType

+0

@trueCamelType Nun, auch dein Beispiel, über das du sagst "Dann bekomme ich genau das, was ich will". Also, im Grunde verstehe ich nicht, was Sie erreichen wollen. –

+0

Aufgrund des uniq-Befehls in meinem Beispiel gibt es mehr als eine Spalte zurück. Es zählt auch die Anzahl der Vorkommen. – trueCamelType