Intereting Posts
Как обновить версию phpMyAdmin с 3.3 до 3.5? Compiz разбился после нескольких хитростей, и теперь я не могу запустить его снова! Могу ли я установить пользователя по умолчанию в lightdm? Как я могу установить Ubuntu на свой Nexus 7, имея возможность восстановить резервную копию Nandroid? Ошибка запуска автозапуска диска Перемещение файлов из специально названных папок / перемещение файлов на один уровень Я немного уменьшил свой шрифт, как мне это исправить? Могу ли я обновить с 8.04 до 12.04? Разница между VGA-совместимым контроллером и 3D-контроллером Я разблокировал кнопку / файлы «Файлы» из моей единственной пусковой установки, и теперь она исчезла, и я не могу ее восстановить или вернуть Ощущение случайного искажения текста Ubuntu 16.04 Можно ли установить Ubuntu на портативный жесткий диск? Расположение гнома-открытого окна Как перезапустить сервер samba? Установите каталог, похожий на диск

Для цикла с именами файлов

У меня есть несколько файлов (таблиц), которые называются: initial _ model _ scene _ river .txt

( институт , модель , сценарий и река являются переменными.) Я хотел бы создать цикл for который будет идентифицировать каждый файл с одним и тем же именем института и в то же время одним и тем же именем сценария , чтобы добавить результаты каждого другую модель в том же выходном файле, используя следующую команду:

 paste filename1.txt filename2.txt > output_file.txt 

Я знаю, как создать цикл for в другой папке, но не над именами файлов. У кого-то есть идея?

В качестве минимального примера имена файлов могут быть следующими:

 wbm_gfdl_rcp8p5_mississippi.txt wbm_hadgem_rcp8p5_mississippi.txt matsiro_gfdl_rcp8p5_mississippi.txt matsiro_ipsl_rcp4p5_mississippi.txt matsiro_hadgem_rcp4p5_mississippi.txt matsiro_miroc_rcp8p5_mississippi.txt 

Затем, я хотел бы добавить следующие файлы вместе:

 wbm_gfdl_rcp8p5_mississippi.txt with wbm_hadgem_rcp8p5_mississippi.txt matsiro_ipsl_rcp4p5_mississippi.txt with matsiro_hadgem_rcp4p5_mississippi.txt matsiro_gfdl_rcp8p5_mississippi.txt with matsiro_miroc_rcp8p5_mississippi.txt 

Если все файлы находятся в одном каталоге, вы можете:

 ls | awk -F_ '{ i=$1; m=$2; s=$3; f[i"_"s] = f[i"_"s] " " $0 } END{ for(insc in f) printf "paste%s >out_%s.txt\n",f[insc],insc }' 

который разбивает имя файла на «_» ( -F_ ), устанавливает переменные i, m, s в первые 3 части имени файла (институт, модель, сценарий) и накапливает в массиве f имя файла. Массив индексируется только институтом и сценарием, поэтому все модели конкатенированы (m не используется). Конечная END печатает массив f и использует индекс (instit_scenario) в качестве имени для выходного файла. С вашими примерами это дает

 paste wbm_gfdl_rcp8p5_mississippi.txt wbm_hadgem_rcp8p5_mississippi.txt >out_wbm_rcp8p5.txt paste matsiro_hadgem_rcp4p5_mississippi.txt matsiro_ipsl_rcp4p5_mississippi.txt >out_matsiro_rcp4p5.txt paste matsiro_gfdl_rcp8p5_mississippi.txt matsiro_miroc_rcp8p5_mississippi.txt >out_matsiro_rcp8p5.txt 

Затем вам нужно передать это в оболочку, чтобы она была выполнена. Добавить | sh | sh до последней строки выше, чтобы сделать это.


Чтобы удалить некоторые столбцы из входных файлов, вам необходимо изменить строку awk, которая собирает все входные имена файлов. В первой строке awk:

 { i=$1; m=$2; s=$3; f[i"_"s] = f[i"_"s] " " $0 } 

имя файла – «$ 0». Например, если вы измените эту строку на:

 { i=$1; m=$2; s=$3; f[i"_"s] = f[i"_"s] sprintf(" <(cut -f4 %s)",$0) } 

то вы получите пример вывода:

 paste <(cut -f4 wbm_gfdl_rcp8p5_mississippi.txt) <(cut -f4 wbm_hadgem_rcp8p5_mississippi.txt) >out_wbm_rcp8p5.txt 

но если вы хотите разрезать только второе имя файла, это немного сложнее, и вам нужно это вместо этого:

 { i=$1; m=$2; s=$3; if(f[i"_"s]=="")add = $0; else add = sprintf("<(cut -f4 %s)",$0); f[i"_"s] = f[i"_"s] " " add } 

так что вы получите

 paste wbm_gfdl_rcp8p5_mississippi.txt <(cut -f4 wbm_hadgem_rcp8p5_mississippi.txt) >out_wbm_rcp8p5.txt 

Если sh не понимает синтаксис <(cut ...) то замените его на bash .

Прежде всего, нет никакой разницы между циклами for для каталогов и одним для файлов. Это точно то же самое. Помните, что на * nix все является файлом .

Итак, ваш цикл будет примерно таким:

 for institute in institute1 institute2 institute3 do for scenario in scenario1 scenario2 scenario3 do paste "$institute"_*_"$scenario"* > "$institute"_"$scenario".out done done 

Если вы не знаете названия института и сценариев, вы можете просто запустить его для всех файлов и извлечь их из имен файлов (если ваши имена не содержат пробелов):

 for f in *; do echo "${f/_*} ${f##*_}"; done | sort -u | while read ins sce; do paste "$ins"_*_"$sce"* > "$ins"_"$sce".out done 

Возможно, используя команду ls. Что-то вроде ls $institute_*_$scenario_*.txt должно возвращать все файлы с тем же институтом и сценарием.