
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 -n
opção head
- isso é possível? Eu tentei usar xargs
e 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 head
de -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 omapfile
builtin 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.