Como percorrer o primeiro arquivo e imprimir cada linha no primeiro arquivo ao lado de todas as linhas no segundo arquivo usando o AWK?

2

Eu acho que o título pode ser confuso, então aqui está um pequeno exemplo do que estou tentando realizar.

Arquivo 1:

Adam
John
Tim

Arquivo 2:

,2018-2-1301
,2018-3-1379
,2018-1-3809
,2018-2-5801

Saída:

Adam,2018-2-1301
Adam,2018-3-1379
Adam,2018-1-3809
Adam,2018-2-5801
John,2018-2-1301
John,2018-3-1379
John,2018-1-3809
John,2018-2-5801
Tim,2018-2-1301
Tim,2018-3-1379
Tim,2018-1-3809
Tim,2018-2-5801

Obrigado!

    
por USC 18.10.2018 / 20:51

3 respostas

1
$ awk 'NR == FNR { names[$1]; next }
                 { for (name in names) printf("%s%s\n", name, $0) }' file1 file2
Adam,2018-2-1301
Tim,2018-2-1301
John,2018-2-1301
Adam,2018-3-1379
Tim,2018-3-1379
John,2018-3-1379
Adam,2018-1-3809
Tim,2018-1-3809
John,2018-1-3809
Adam,2018-2-5801
Tim,2018-2-5801
John,2018-2-5801

Isso usa awk para ler o primeiro arquivo (o arquivo com os três nomes) em uma matriz associativa (como chaves). Quando se trata de ler o segundo arquivo, cada linha do segundo arquivo é reproduzida repetidamente junto com cada nome de leitura anterior.

O teste NR == FNR é verdadeiro se estivermos lendo o primeiro arquivo. Ele testa o número do registro geral ("número da linha") com o número do registro no arquivo atual.

Você também pode fazer uma mesclagem cruzada com o GNU join assim:

$ join -j 99 -o1.1,2.1 file[12]
Adam ,2018-2-1301
Adam ,2018-3-1379
Adam ,2018-1-3809
Adam ,2018-2-5801
John ,2018-2-1301
John ,2018-3-1379
John ,2018-1-3809
John ,2018-2-5801
Tim ,2018-2-1301
Tim ,2018-3-1379
Tim ,2018-1-3809
Tim ,2018-2-5801

... onde 99 é um campo não existente em qualquer arquivo.

Neste exemplo, os espaços inseridos podem ser removidos canalizando o resultado por meio de tr -d ' ' .

    
por 18.10.2018 / 22:02
1

Que tal isso?

$ cat names 
Adam
John
Tim

$ cat dates
,2018-2-1301
,2018-3-1379
,2018-1-3809
,2018-2-5801


$ while read name; do 
    while read date; do   
      n='echo "$name" | awk '{print $1};''
      d='echo "$date" | awk '{print $1};''
      echo "$n $d"
    done < dates
  done < names


Adam ,2018-2-1301
Adam ,2018-3-1379
Adam ,2018-1-3809
Adam ,2018-2-5801
John ,2018-2-1301
John ,2018-3-1379
John ,2018-1-3809
John ,2018-2-5801
Tim ,2018-2-1301
Tim ,2018-3-1379
Tim ,2018-1-3809
Tim ,2018-2-5801
    
por 18.10.2018 / 22:01
1

Você pode tentar este awk:

awk 'NR==FNR{a[NR]=$0;b=NR;next}{for(i=1;i<=b;i++)print $0 a[i]}' File2 File1
    
por 18.10.2018 / 22:08