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.
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.
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
.
Tags bash shell-script head gnu-parallel