다음 패턴의 명명 규칙을 따르는 파일이 있습니다.
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
...
같은 그룹의 모든 파일을 하나로 연결하고 싶습니다. 예를 들어:
cat bond_7.LEU.CA.*.dat > ../bondvalues/bond_7.LEU.CA.1_3.dat
이러한 파일이 많이 있습니다. Bash 스크립트를 사용하여 이를 어떻게 달성할 수 있나요?
답변1
제공한 예제가 모든 파일을 반영한다고 가정하면 다음이 트릭을 수행해야 합니다.
for f in *.1.dat
do
cat ${f%%1.dat}* > ${f%%1.dat}1_3.dat
done
이를 위해서는 각 그룹에 .1.dat 확장자를 가진 파일이 포함되어 있어야 합니다.
답변2
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