Katzendateien in einer bestimmten Reihenfolge basierend auf der Nummer im Dateinamen

11

Ich habe Dateien mit dem Namen file.88_0.pdb, file.88_1.pdb, ..., file.88_100.pdb. Ich möchte catsie, damit sie file.88_1.pdbnach file.88_0.pdb, file.88_2.pdbnach file.88_1.pdbund so weiter eingefügt werden . Wenn ich das tue cat file.88_*.pdb > all.pdb, werden die Dateien in der folgenden Reihenfolge zusammengestellt: 0 1 10 11 12 13 14 15 16 17 18 19 2 20...usw. Wie füge ich sie so zusammen, dass die Reihenfolge ist 0 1 2 3 4 5 6...?

Natriumnitrat
quelle
1
Übrigens könnten Sie an unserer neuen Bioinformatik- Website interessiert sein, wenn Sie vor Ort arbeiten.
Terdon

Antworten:

24

Verwenden brace expansion

cat file.88_{0..100}.pdb >>bigfile.pdb

Um das Drucken der Fehlermeldungen für nicht vorhandene Dateien zu ignorieren, verwenden Sie:

cat file.88_{0..100}.pdb >>bigfile.pdb 2>/dev/null

In der zshShell haben Sie auch das (n)Globbing-Qualifikationsmerkmal, um eine numerische Sortierung (im Gegensatz zur Standardeinstellung alphabetisch ) für Globs anzufordern:

cat file.88_*.pdb(n) >>bigfile.pdb 2>/dev/null
αғsнιη
quelle
3
cat $(for((i=0;i<101;i++)); do echo -n "file.88_${i}.pdb "; done)

oder in Bezug auf den Kommentar von Jesse_b:

cat $(for((i=0;i<101;i++)); do test -f "file.88_${i}.pdb" && echo -n "file.88_${i}.pdb "; done)
Hauke ​​Laging
quelle
2

Versuchen:

filedir="/path/to/files"
output="/path/to/all.pdb"
for file in $(find $filedir -type f -name "file.88_*" | sort -t "_" -k2 -n); do
    cat $file >> $output
done

Dies konnte sortdie Dateien durch das ( -k2) zweite Feld _als Trennzeichen verwenden. Hier müssen Sie verwenden, >>sonst überschreibt jede neue Datei die letzte.

jesse_b
quelle
Ich bekomme immer noch die falsche Reihenfolge:0 1 10 11 12...
Natriumnitrat
Welches Betriebssystem hast du? Wenn du tust, sort --versionwas bekommst du? Und Sie haben den -nBefehl sortieren richtig?
Jesse_b
OSX El Capitan,sort (GNU coreutils) 5.93
Natriumnitrat
1
Vielen Dank für den Versuch! Die /dev/nullErgänzung zur anderen Antwort wurde dringend benötigt!
Natriumnitrat
1
Nutzlose Verwendung der Befehlssubstitution . Verwenden Sie find ... | sort ... | xargs cat >> $outputstattdessen so etwas wie .
David Foerster
2

In der Shell ohne Klammererweiterung können Sie ls+ verwenden xargs:

ls -v file.88_*.pdb | xargs cat > all.pdb

ls sortiert Dateien in numerischer Reihenfolge:

-v natürliche Art von (Versions-) Zahlen im Text.

Alexander Kovalev
quelle