Ich habe Dateien mit einer Namenskonvention nach diesem Muster:
bond_7.LEU.CA.1.dat
bond_7.LEU.CA.2.dat
bond_7.LEU.CA.3.dat
bond_12.ALA.CB.1.dat
bond_12.ALA.CB.2.dat
bond_12.ALA.CB.3.dat
...
Ich möchte alle Dateien derselben Gruppe zu einer einzigen zusammenfassen. Beispiel:
cat bond_7.LEU.CA.*.dat > ../bondvalues/bond_7.LEU.CA.1_3.dat
Es gibt eine große Anzahl dieser Dateien. Wie kann dies mit einem Bash-Skript erreicht werden?
Antwort1
Vorausgesetzt, dass das von Ihnen angegebene Beispiel alle Ihre Dateien widerspiegelt, sollte Folgendes funktionieren:
for f in *.1.dat
do
cat ${f%%1.dat}* > ${f%%1.dat}1_3.dat
done
Dies erfordert, dass jede Gruppe eine Datei mit der Erweiterung .1.dat enthält.
Antwort2
printf "%s\n" * | cut -d. -f1-3 | sort -u | while read prefix; do
files=(${prefix}*)
first=$(cut -d. -f4 <<< "${files[0]}")
last=$(cut -d. -f4 <<< "${files[${#files[@]}-1]}")
newfile=$(printf "../bondvalues/%s.%s_%s.dat" "$prefix" "$first" "$last")
cat "${files[@]}" > "$newfile"
done