Como passar o conteúdo de um arquivo para uma opção/parâmetro de uma função

Como passar o conteúdo de um arquivo para uma opção/parâmetro de uma função

Eu tenho um conjunto de pares de arquivos .txt. Em cada par de arquivos, Arquivo1 contém um único número inteiro e Arquivo2 contém muitas linhas de texto. No script que estou escrevendo, gostaria de usar o número inteiro no Arquivo1 para especificar quantas linhas retirar do topo do Arquivo2 e depois gravar essas linhas em outro arquivo. Estou usando o gnu-parallel para executar isso em muitos pares de arquivos em paralelo.

Parece que uma maneira simples de fazer isso seria passar o conteúdo do Arquivo1 como parâmetro para a -nopção head- isso é possível? Eu tentei usar xargse cat File1, mas nenhum deles está funcionando.

Um exemplo de par de arquivos:

File1:
2                        

File2:
AAA
BBB
CCC
DDD

Saída desejada:

File3:
AAA
BBB

Se eu não estivesse usando gnu-parallel, poderia atribuir o conteúdo de File1 a uma variável (embora não saiba se poderia passar isso para a opção headde -n?); no entanto, os paralelos {}parecem complicar esta abordagem.

Posso fornecer mais informações, se necessário.

Responder1

Use umsubstituição de comando.

head -n "$(cat File1)" File2

Uma substituição de comando injeta a saída do comando em uma linha de comando. As novas linhas no final da saída são removidas, e é exatamente isso que você precisa aqui.

Alternativamente, no bash (mas não em outras variantes do sh), você pode usar omapfilebuiltin para carregar um arquivo linha por linha.

mapfile lines <File1
head -n "${lines[0]}" File2

As linhas são carregadas em um array, então o número da linhané . Para a primeira linha, o bash também permite escrever .${lines[n]}$line

Responder2

Estendendo a resposta de Gilles:

parallel 'head -n "$(cat {1})" {2}' ::: File1s* :::+ Corresponding_File2s*

Você provavelmente tem muitos arquivos 1 que deseja vincular aos arquivos 2. O :::+ faz isso.

informação relacionada