Se eu tiver um arquivo delimitado com muitas linhas e colunas ( data.txt
):
346 dfd asw 34
565 sd wdew 34
667 ffg wew 23
473 sa as 21
533 jhf qwe 54
e outro arquivo com os números das linhas que desejo extrair ( positions.txt
)
3
5
8
Como uso o positions.txt
arquivo para extrair essas posições data.txt
? Este é o resultado que eu esperaria para este exemplo:
667 ffg wew 23
533 jhf qwe 54
Simplesmente com
awk
:NR==FNR{ ... }
- processando o 1º arquivo de entrada (ou sejapositions.txt
):pos[$1]
- acumulando posições (números de registro) definidas comopos
chaves de matriznext
- pular para o próximo registroFNR in pos
- durante o processamento do 2º arquivo de entradadata.txt
(FNR
indica quantos registros foram lidos do arquivo de entrada atual). Imprimir registro somente se o número do registro atualFNR
estiver em uma matriz de posiçõespos
(pesquisa nas teclas)Exemplo de saída:
Primeiro crie um
sed
script a partir dopositions.txt
arquivo:Isso irá produzir
Este script simples imprimirá apenas as linhas indicadas.
Em seguida, aplique isso ao
data.txt
arquivo. Se você estiver usandobash
(ou qualquer shell que entenda as substituições de processo com<( ... )
):O
-n
párased
de produzir qualquer coisa diferente do que é explicitamente impresso pelosed
script fornecido.Com os exemplos dados, isso produzirá
Se não estiver usando
bash
, então... fará a mesma coisa.
Se
positions.txt
for classificado, também é possível fazer isso em uma única passagem pelos dois arquivos e sem armazenarpositions.txt
por completo. Simplesmente leia a próxima linhapositions.txt
quando a linha correspondente anterior for atendida:Na prática, isso só é útil se ambos os arquivos forem muito grandes ou se você estiver com pouca memória.
podemos fazer isso por loop for simples
Method1 usando sed e for loop
resultado
Method2 usando awk e loop for
resultado