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

1

Eu tenho um conjunto de pares de arquivos .txt. Em cada par de arquivos, o Arquivo1 contém um único inteiro e o Arquivo2 contém muitas linhas de texto. No script que estou escrevendo, gostaria de usar o inteiro no arquivo 1 para especificar quantas linhas para tirar a parte superior do arquivo2 e, em seguida, gravar essas linhas em outro arquivo. Estou usando o gnu-parallel para rodar isso em muitos pares de arquivos em paralelo.

Parece que uma maneira simples de fazer isso seria passar o conteúdo de File1 como o parâmetro para a opção -n de head - isso é possível? Eu tentei usar xargs e cat File1 , mas nenhum 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 o gnu-parallel, poderia atribuir o conteúdo de File1 a uma variável (embora eu não saiba se poderia passar isso para a opção head ' -n '); no entanto, o {} do paralelo parece complicar essa abordagem.

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

    
por guest 26.04.2017 / 02:16

2 respostas

0

Estendendo a resposta de Gilles:

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

Você provavelmente tem muitos arquivos1 que deseja vincular a arquivos2. O ::: + faz isso.

    
por 26.04.2017 / 09:10
1

Use uma substituição de comando .

head -n "$(cat File1)" File2

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

Como alternativa, no bash (mas não em outras variantes sh), você pode usar o mapfile embutido para carregar um arquivo linha por linha.

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

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

    
por 26.04.2017 / 02:26