#! /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
El script se encuentra en una carpeta junto con 1000 archivos DAT, cada uno con 50 líneas de texto.
Los archivos dat se llaman 1.dat
, 2.dat
,....,1000.dat
Mi propósito es crear archivos l.txt
, donde l.txt
tiene la línea l de 1.dat
, la línea l de 2.dat
, etc. Para eso, uso el sed
comando para seleccionar el archivo l de cada archivo dat.
Pero cuando ejecuto el script anterior, el texto creado no tiene nada dentro...
¿Dónde está el error?
Respuesta1
for LINE in {1..50}; do
for FILE in {1..1000}; do
sed -n "${LINE}p" "${FILE}.dat" >>"~/Escritorio/${LINE}.dat"
done
done
En su secuencia de comandos está utilizando comillas simples para la expresión sed, las variables no se expanden dentro de comillas simples, debe usar comillas dobles.
También hay una línea con awk que puede hacer lo mismo:
awk 'FNR<=50 {filename=sprintf("results/%d.dat", FNR); print >> filename; close(filename)}' *.dat
Simplemente cree el directorio de resultados o cámbielo en el comando a otro, ~
no se expande al inicio allí.
Respuesta2
¿Qué tal este comando awk? prueba con un pequeño conjunto de archivos dat
awk '{file=FNR".txt"; print $0 > file}' *.dat