Ich habe versucht, die Skripte zu machen, die ich schreibe einfacher und einfacher.Leicht zählen Wörter in einer Liste von Dateien in einem Ordner nach grep -v Befehl
Es gibt zahlreiche Möglichkeiten zum Schreiben die Anzahl der Wörter aller Dateien in einem Ordner oder sogar alle Dateien von Unterverzeichnissen eines Ordners zu erhalten.
Zum Beispiel könnte ich
wc */*
schreiben, und ich könnte Ausgabe wie folgt (dies ist die gewünschte Ausgabe) erhalten:
0 0 0 10.53400000/YRI.GS000018623.NONSENSE.vcf
0 0 0 10.53400000/YRI.GS000018623.NONSTOP.vcf
0 0 0 10.53400000/YRI.GS000018623.PFAM.vcf
0 0 0 10.53400000/YRI.GS000018623.SPAN.vcf
0 0 0 10.53400000/YRI.GS000018623.SVLEN.vcf
2 20 624 10.53400000/YRI.GS000018623.SVTYPE.vcf
2 20 676 10.53400000/YRI.GS000018623.SYNONYMOUS.vcf
13 130 4435 10.53400000/YRI.GS000018623.TSS-UPSTREAM.vcf
425 4250 126381 10.53400000/YRI.GS000018623.UNKNOWN-INC.vcf
aber wenn es zu viele Dateien sind, könnte ich bekommen eine Fehlermeldung wie diese:
-bash: /usr/bin/wc: Argument list too long
so könnte ich eine Variable machen und einen Ordner nach dem anderen machen, so:
while read $FOLDER
do
wc $FOLDER/* >> outfile.txt
done < "$FOLDER_LIST"
so geht das von einer Zeile bis 5 einfach so.
Ferner wird in einem Fall möchte ich grep -v
zuerst verwenden, dann carryout das Wort zählen, etwa so:
grep -v dbsnp */* | wc
aber dies würde von zwei Fehlern leiden:
- Argumentliste zu lang
- Wenn es nicht zu lang wäre, würde es das wc für alle Dateien auf einmal geben, nicht pro Datei.
also rekapitulieren, würde ich gerne dieses in der Lage sein zu tun:
grep -v dbsnp */* wc > Outfile.txt
awk '{print $4,$1} Outfile.txt > Outfile.summary.txt
und es hat Rückkehr ausgegeben, wie ich oben zeigte.
Gibt es eine sehr einfache Möglichkeit, dies zu tun? Oder schaue ich mir wenigstens eine Schleife an? Ich kenne 101 Möglichkeiten, dies genauso zu tun wie der Rest von uns mit einem 4-10 Zeilen Skript, aber ich würde gerne in der Lage sein, einfach 2 Liner in die Eingabeaufforderung einzugeben ... und mein Wissen über die Shell ist noch nicht tief genug, um zu wissen, welche Wege erlauben würden, was ich vom OS verlangen würde.
EDIT -
Eine Lösung vorgeschlagen wurde:
find -exec grep -v dbsnp {} \; | xargs -n 1 wc
Diese Lösung der folgenden Ausgabe führt:
wc: 1|0:53458644:AMBIGUOUS:CCAGGGC|-16&GCCAGGGCCAGGGC|-18&GCCAGGGCC|-19&GGCCAGGGC|-19&GCCAGGGCG|-19,.:48:48,48:4,4:0,17:-48,0,-48:0,0,-17:27:3,24:24: No such file or directory
wc: 10: No such file or directory
wc: 53460829: No such file or directory
wc: .: Is a directory
0 0 0 .
wc: AA: No such file or directory
wc: CT: No such file or directory
wc: .: Is a directory
0 0 0 .
wc: .: Is a directory
0 0 0 .
so nahe wie ich sagen kann, die Behandlung jeder Zeile zu sein scheint als eine Datei. Ich überprüfe immer noch die anderen Antworten und danke für Ihre Hilfe.
@Vincent Ich konnte den Zweck nicht verstehen mit 'grep -v', Wenn du ein wenig darauf eingehen kannst, können wir versuchen, eine Lösung um sie herum zu bauen.Sie benutzen 'grep -v', es schließt alle Zeilen aus, die' dbsnp enthalten ', und zählen Sie die Wörter, oder Sie möchten nur aus der Wortzahl dbsnp ausschließen? – PradyJord
Ich möchte die gesamte Zeile ausschließen, und Ich sollte hinzufügen, ich bin eigentlich Ziel, wc -l Dies funktioniert und hatte die beabsichtigte Wirkung (alle anderen Antworten tatsächlich fehlgeschlagen - danke !!!) –
überprüfen Sie bitte 2. finden – PradyJord