Pegue a primeira coluna de 2 arquivos e grave em um terceiro arquivo

5

Suponha que eu tenha 2 arquivos, ABC.txt & PQR.txt com os dados mostrados abaixo como exemplo:

ABC.txt:

ABC DEF

PQR.txt:

PQR XYZ

Eu quero grep column 1 dos dois arquivos e escrevo em um terceiro arquivo de texto. Como isso pode ser feito?

Minha saída esperada é (output.txt):

ABC PQR
    
por Rahul Patil 10.11.2014 / 13:51

3 respostas

7

Aqui estão algumas maneiras:

  • Usando paste e cut :

    $ paste -d ' ' <(cut -d' ' -f 1 ABC.txt ) <(cut -d' ' -f 1 PQR.txt ) > output.txt
    ABC PQR
    

    Se o seu sistema não suporta a substituição de processos, use isto:

    $ cut -d' ' -f 1 ABC.txt > /tmp/aa; cut -d' ' -f 1 PQR.txt > /tmp/bb; paste -d ' ' /tmp/aa /tmp/bb
    
  • Usando awk (obrigado @Costas):

    awk 'FNR==NR{a[FNR]=$1; next}{print a[FNR],$1}' ABC.txt PQR.txt > output.txt
    

    A variável especial FNR é o número da linha do arquivo de entrada atual e NR é o número da linha da entrada em geral, seja qual for o arquivo de onde veio. Os dois são iguais apenas enquanto o primeiro arquivo de entrada está sendo lido. Assim, os primeiros campos do primeiro arquivo são salvos no a array ( a[FNR]=$1 ) cujas chaves são números de linha e cujos valores são os primeiros campos. Então, quando o segundo arquivo for alcançado, imprimiremos o valor correspondente ao seu número de linha ( a[NR] ) e o primeiro campo da linha atual.

por 10.11.2014 / 14:10
5

Você pode numerar linhas por nl e usar join

join -o 1.2,2.2 <(nl ABC.txt) <(nl PQR.txt) > OUT.file

Ou por cat -n

join -o 1.2,2.2 <(cat -n ABC.txt) <(cat -n PQR.txt) > OUT.file

Como Analisar dois arquivos de entrada no loop for / while você pode usar apenas bash builtins

while read -u 3 a b && read -u 4 c d
do
  echo "$a $c"
done 3< ABC.txt 4< PQR.txt >OUT.txt
    
por 10.11.2014 / 14:43
4

Supondo que os campos estão separados por um único espaço nos arquivos de entrada, eu escreveria:

paste -d " " ABC.txt PQR.txt | cut -d " " -f 1,3 > Output.txt

Para lidar com espaços em branco arbitrários e mais de 2 colunas por arquivo, e supondo que seu shell é bash / ksh / zsh (?)

paste -d " " <(awk '{print $1}' ABC.txt) <(awk '{print $1}' PQR.txt) > Output.txt
    
por 10.11.2014 / 14:02