Скрипт bash для применения ncrcat к нескольким файлам на основе номера цикла

Поскольку у вас в переменных есть обычный текст, перенаправление их в цикл чтения 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')

1
24.05.2020, 00:21
1 ответ

Учитывая список файлов, подобных этому (из вашего примера, плюс все номера от 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в качестве выходного файла.
1
18.03.2021, 23:33

Теги

Похожие вопросы