Exibe o conteúdo do arquivo se ele tiver o número da linha correspondente

1

Eu tenho dois arquivos no seguinte formato:

File A
4
5
8
9

File B
1 text
2 text1
3 text2
4 text3
5 text4
6 text5
7 text6
8 text7
9 text8

O que eu quero ter para minha saída é apenas o seguinte (o segundo campo no Arquivo B se corresponder ao número da linha no Arquivo A):

test3
test4
text7
text8
    
por user3299633 05.06.2016 / 20:10

3 respostas

1

Você pode criar um script sed simples a partir do arquivo A adicionando p a cada linha e, em seguida, executar o script em outro sed com -n para não imprimir as outras linhas. Além disso, não há necessidade de salvar o script gerado, você pode canalizá-lo entre o sed s:

sed 's/$/p/' A | sed -nf- B
    
por 05.06.2016 / 20:22
1
$ awk 'FNR==NR{seen[$1];next;} FNR in seen' FileA FileB
text3
text4
text7
text8

Como funciona

  • FNR==NR{seen[$1];next;}

    Durante a leitura do primeiro arquivo, isso adiciona cada número como um keey ao array associativo seen .

    FNR é o número da linha do arquivo atual e NR é o número da linha entre todas as linhas lidas. Então, quando FNR==NR , então ainda estamos lendo o primeiro arquivo, FileA neste caso. seen[$1] cria uma chave em seen com valor $1 . next diz ao awk para pular o resto dos comandos e começar de novo na próxima linha.

  • FNR in seen

    Ao ler o segundo arquivo, isso imprime qualquer linha se o número da linha estiver em seen .

    FNR in seen é uma condição. Ele é avaliado como verdadeiro se o número da linha FNR for uma chave na matriz seen . Como não especificamos nenhuma ação para essa condição, é executada a ação padrão que é imprimir a linha.

por 05.06.2016 / 20:45
1

Você está fazendo uma operação "join" relacional, então use o comando padrão join do UNIX:

$ join fileA.txt fileB.txt
4 text3
5 text4
8 text7
9 text8

Para obter apenas o segundo campo do segundo arquivo, adicione -o 2.2 :

$ join -o 2.2 fileA.txt fileB.txt
text3
text4
text7
text8

Ambos os arquivos precisam ser classificados no campo de junção (a primeira coluna neste exemplo) para que isso funcione.

Felicidades!

    
por 06.06.2016 / 10:08