Se os arquivos estiverem todos no mesmo diretório, você pode:
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
}'
que divide o nome do arquivo em "_" ( -F_
), define as variáveis i, m, s
para as 3 primeiras partes do nome do arquivo (instituto, modelo, cenário),
e se acumula na matriz f do nome do arquivo. A matriz é indexada
somente pelo instituto e cenário, então todos os modelos são concatenados
(não é usado). A END final imprime a matriz f e usa o índice (institute_scenario) como
nome para o arquivo de saída. Com seus exemplos, isso produz
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
Você então precisa canalizar isso no shell para executá-lo. Adicione | sh
à última linha acima para fazer isso.
Para remover algumas colunas dos arquivos de entrada, você precisa alterar a linha do awk que está coletando todos os nomes de arquivos de entrada. Na primeira linha do awk:
{ i=$1; m=$2; s=$3; f[i"_"s] = f[i"_"s] " " $0 }
o nome do arquivo é o "$ 0". Por exemplo, se você alterar esta linha para:
{ i=$1; m=$2; s=$3; f[i"_"s] = f[i"_"s] sprintf(" <(cut -f4 %s)",$0) }
então você receberá a saída de exemplo:
paste <(cut -f4 wbm_gfdl_rcp8p5_mississippi.txt) <(cut -f4 wbm_hadgem_rcp8p5_mississippi.txt) >out_wbm_rcp8p5.txt
mas se você quiser cortar apenas o segundo nome de arquivo, é um pouco mais complicado e você precisa disso:
{ 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 }
para que você receba
paste wbm_gfdl_rcp8p5_mississippi.txt <(cut -f4 wbm_hadgem_rcp8p5_mississippi.txt) >out_wbm_rcp8p5.txt
Se sh
não entender a sintaxe <(cut ...)
, substitua-a por bash
.