
Tengo un conjunto de pares de archivos .txt. En cada par de archivos, Archivo1 contiene un único número entero y Archivo2 contiene muchas líneas de texto. En el script que estoy escribiendo, me gustaría usar el número entero en Archivo1 para especificar cuántas líneas quitar de la parte superior del Archivo2 y luego escribir esas líneas en otro archivo. Estoy usando gnu-parallel para ejecutar esto en muchos pares de archivos en paralelo.
Parece que una forma sencilla de hacer esto sería pasar el contenido del Archivo1 como parámetro para la -n
opción de head
: ¿es esto posible? Intenté usar xargs
y cat File1
, pero ninguno funciona.
Un par de archivos de ejemplo:
File1:
2
File2:
AAA
BBB
CCC
DDD
Salida deseada:
File3:
AAA
BBB
Si no estuviera usando gnu-parallel, podría asignar el contenido de File1 a una variable (aunque no sé si podría pasar eso a la opción head
's -n
'); sin embargo, los paralelos {}
parecen complicar este enfoque.
Puedo proporcionar más información si es necesario.
Respuesta1
Usar unasustitución de comando.
head -n "$(cat File1)" File2
Una sustitución de comando inyecta la salida del comando en una línea de comando. Se eliminan las nuevas líneas al final del resultado, que es exactamente lo que necesita aquí.
Alternativamente, en bash (pero no en otras variantes de sh), puedes usar elmapfile
incorporado para cargar un archivo línea por línea.
mapfile lines <File1
head -n "${lines[0]}" File2
Las líneas se cargan en una matriz, por lo que el número de líneanortees . Para la primera línea, bash también te permite escribir .${lines[n]}
$line
Respuesta2
Ampliando la respuesta de Gilles:
parallel 'head -n "$(cat {1})" {2}' ::: File1s* :::+ Corresponding_File2s*
Probablemente tenga muchos Archivos1 que desee vincular a Archivos2. El :::+ hace eso.