Para loop dentro de outro não funciona

4
#! /bin/bash
for (( l = 1 ; l <= 50; ++l )) ; do
       for (( k = 1 ; k <= 1000; ++k )) ; do
       sed -n '$l,$lp' $k.dat >> ~/Escritorio/$l.txt
       done
done

O script está localizado em uma pasta junto com 1000 arquivos de dados, cada um com 50 linhas de texto.

Os arquivos dat são chamados 1.dat , 2.dat , ...., 1000.dat

Meu objetivo é criar arquivos l.txt , onde l.txt tem a linha l de 1.dat , a linha l de 2.dat , etc. Para isso, eu uso o comando sed para selecionar o arquivo l arquivo de cada arquivo dat.

Mas quando eu executo o script acima, o txt criado não tem nada dentro ...

Onde está o erro?

    
por Diego 02.11.2016 / 02:08

2 respostas

6
for LINE in {1..50}; do
    for FILE in {1..1000}; do
        sed -n "${LINE}p" "${FILE}.dat" >>"~/Escritorio/${LINE}.dat"
    done
done

No seu script você está usando aspas simples para a expressão sed, as variáveis não expandem entre aspas simples, você precisa usar aspas duplas.

Também há um forro com o awk que pode fazer o mesmo:

awk 'FNR<=50 {filename=sprintf("results/%d.dat", FNR); print >> filename; close(filename)}' *.dat

Basta criar o diretório de resultados ou alterá-lo no comando para outro, ~ não expande para a página inicial.

    
por 02.11.2016 / 02:59
4

que tal este comando awk? tente com um pequeno conjunto de arquivos dat

awk '{file=FNR".txt"; print $0 > file}' *.dat
    
por 02.11.2016 / 02:37

Tags