Поскольку у вас в переменных есть обычный текст, перенаправление их в цикл чтения while -кажется смехотворно более -сложным.
Что не так с
var1="somedata..."
var2="anotherdata..."
string="uvuveve"
echo "$var1;$var2;$string"
# or
printf '%s;%s;%s\n' "$var1" "$var2" "$string"
Если у вас действительно есть файлы, вам нужен цикл.Если у нас есть
$ cat file1
a
b
c
$ cat file2
1
2
3
затем
string="uvuveve"
while IFS= read -r -u3 a; read -r -u4 b; do
printf '%s;%s;%s\n' "$a" "$b" "$string"
done 3
a;1;uvuveve
b;2;uvuveve
c;3;uvuveve
Возврат к редактированию :используйте Подстановка процесса s
# don't repeat yourself
dates=$(grep -A12 -B12 "$tofind" $findlogs | grep Date)
string="uvuveve"
while IFS= read -r -u3 a; read -r -u4 b; do
printf '%s;%s;%s\n' "$a" "$b" "$string"
done 3< <(echo "$dates" | cut -c 51-65 | sed -e 's! !/!g') \
4< <(echo "$dates" | cut -c 67-71 | sed -e 's/://g')
Учитывая список файлов, подобных этому (из вашего примера, плюс все номера от 000
до 100
дляa
):
$ ls
a.000.nc a.007.nc a.014.nc a.021.nc a.028.nc a.035.nc a.042.nc a.049.nc a.056.nc a.063.nc a.070.nc a.077.nc a.084.nc a.091.nc a.098.nc c.001.nc
a.001.nc a.008.nc a.015.nc a.022.nc a.029.nc a.036.nc a.043.nc a.050.nc a.057.nc a.064.nc a.071.nc a.078.nc a.085.nc a.092.nc a.099.nc c.002.nc
a.002.nc a.009.nc a.016.nc a.023.nc a.030.nc a.037.nc a.044.nc a.051.nc a.058.nc a.065.nc a.072.nc a.079.nc a.086.nc a.093.nc a.100.nc
a.003.nc a.010.nc a.017.nc a.024.nc a.031.nc a.038.nc a.045.nc a.052.nc a.059.nc a.066.nc a.073.nc a.080.nc a.087.nc a.094.nc b.000.nc
a.004.nc a.011.nc a.018.nc a.025.nc a.032.nc a.039.nc a.046.nc a.053.nc a.060.nc a.067.nc a.074.nc a.081.nc a.088.nc a.095.nc b.001.nc
a.005.nc a.012.nc a.019.nc a.026.nc a.033.nc a.040.nc a.047.nc a.054.nc a.061.nc a.068.nc a.075.nc a.082.nc a.089.nc a.096.nc b.002.nc
a.006.nc a.013.nc a.020.nc a.027.nc a.034.nc a.041.nc a.048.nc a.055.nc a.062.nc a.069.nc a.076.nc a.083.nc a.090.nc a.097.nc c.000.nc
Можно сделать:
for f in *.nc; do echo ${f//\.*}; done | sort | uniq |
while read prefix; do echo ncrcat "$prefix".*nc "$prefix".nc; done
Это производит этот вывод:
ncrcat a.000.nc a.001.nc a.002.nc a.003.nc a.004.nc a.005.nc a.006.nc a.007.nc a.008.nc a.009.nc a.010.nc a.011.nc a.012.nc a.013.nc a.014.nc a.015.nc a.016.nc a.017.nc a.018.nc a.019.nc a.020.nc a.021.nc a.022.nc a.023.nc a.024.nc a.025.nc a.026.nc a.027.nc a.028.nc a.029.nc a.030.nc a.031.nc a.032.nc a.033.nc a.034.nc a.035.nc a.036.nc a.037.nc a.038.nc a.039.nc a.040.nc a.041.nc a.042.nc a.043.nc a.044.nc a.045.nc a.046.nc a.047.nc a.048.nc a.049.nc a.050.nc a.051.nc a.052.nc a.053.nc a.054.nc a.055.nc a.056.nc a.057.nc a.058.nc a.059.nc a.060.nc a.061.nc a.062.nc a.063.nc a.064.nc a.065.nc a.066.nc a.067.nc a.068.nc a.069.nc a.070.nc a.071.nc a.072.nc a.073.nc a.074.nc a.075.nc a.076.nc a.077.nc a.078.nc a.079.nc a.080.nc a.081.nc a.082.nc a.083.nc a.084.nc a.085.nc a.086.nc a.087.nc a.088.nc a.089.nc a.090.nc a.091.nc a.092.nc a.093.nc a.094.nc a.095.nc a.096.nc a.097.nc a.098.nc a.099.nc a.100.nc a.nc
ncrcat b.000.nc b.001.nc b.002.nc b.nc
ncrcat c.000.nc c.001.nc c.002.nc c.nc
Предполагая, что это правильно, удалите echo
и снова запустите команду, чтобы фактически объединить файлы.
for f in *.nc; do...; done
:перебрать все файлы (и каталоги, если таковые имеются ), заканчивающиеся на .nc
. echo ${f//\.*};
:удалить все после первого .
. Это просто распечатает префиксы a
, b
и c
. sort | uniq
:оставить только по одному префиксу. while read prefix; do...; done
:перебрать каждый префикс. ncrcat "$prefix".*nc "$prefix".nc
:запустить nrcat
для всех имен файлов, начинающихся с этого префикса и заканчивающихся на .nc
, указав $prefix.nc
в качестве выходного файла.