Cómo pasar el contenido de un archivo a una opción/parámetro de una función

Cómo pasar el contenido de un archivo a una opción/parámetro de una función

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 -nopción de head: ¿es esto posible? Intenté usar xargsy 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 elmapfileincorporado 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.

información relacionada