Jaki jest najłatwiejszy sposób na łączenie grup plików razem?


1

Mam pliki z konwencją nazewnictwa tego wzorca:

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
...

Chcę połączyć wszystkie pliki tej samej grupy w jeden. Na przykład:

cat bond_7.LEU.CA.*.dat > ../bondvalues/bond_7.LEU.CA.1_3.dat

Istnieje duża liczba tych plików. Jak można to osiągnąć za pomocą skryptu bash?


Czy w danej grupie są zawsze dokładnie trzy pliki? Jeśli liczba plików jest zmienna, czy musi to być, bond_7.LEU.CA.1_3.datczy bond_7.LEU.CA.datteż powinno ? To drugie jest łatwiejsze.
Dennis

Odpowiedzi:


2

Zakładając, że podany przez ciebie przykład odzwierciedla wszystkie twoje pliki, poniższe czynności powinny załatwić sprawę:

for f in *.1.dat
do
  cat ${f%%1.dat}* > ${f%%1.dat}1_3.dat
done

Wymaga to, aby każda grupa zawierała plik z rozszerzeniem .1.dat.


0
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 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.