#! /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 dat cada um com 50 linhas de texto.
Os arquivos dat são chamados 1.dat
, 2.dat
,....,1000.dat
Meu objetivo é fazer arquivos l.txt
, onde l.txt
tem a linha l de 1.dat
, a linha l de 2.dat
, etc. Para isso, utilizo o sed
comando para selecionar o arquivo l de cada arquivo dat.
Mas quando executo o script acima, o txt criado não contém nada...
Onde está o erro?
Responder1
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 se expandem entre aspas simples, você precisa usar aspas duplas.
Também existe um liner com 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 casa lá.
Responder2
que tal este comando awk? tente com um pequeno conjunto de arquivos dat
awk '{file=FNR".txt"; print $0 > file}' *.dat