Linhas Intersperse de dois arquivos

3

Eu tenho um arquivo de dados ( $file1 ) que contém duas linhas de dados por indivíduo. Eu preciso intercalar uma terceira linha de dados de outro arquivo de dados ( $file2 ). Então minha entrada parece:

>cat $file1
  bob  1  1  0
  bob  1  0  1
  alan 0  0  1
  alan 0  1  1

>cat $file2
 bob  a  a  b
 alan a  c  a

Assim, o resultado desejado seria:

>cat $file3
  bob  1  1  0
  bob  1  0  1
  bob  a  a  b
  alan 0  0  1
  alan 0  1  1
  alan a  c  a

Se eu precisasse intercalar todas as outras linhas, eu teria usado paste da seguinte forma:

>paste '-d\n' $file1 $file2

Qual seria a melhor ferramenta para conseguir isso? Estou usando zsh .

    
por Simon O'Hanlon 11.01.2016 / 18:34

3 respostas

9

Apenas:

paste -d '\n' -- - - "$file2" < "$file1"

(desde $file2 não é - ).

Ou com o GNU sed , desde que $file2 (o conteúdo da variável, o nome do arquivo) não contenha caracteres de nova linha e não comece com um caractere de espaço ou tabulação:

sed "2~2R$file2" "$file1" < "$file2"

Com awk (desde que $file1 não contenha = caracteres (ou pelo menos que, se existir, a parte anterior não é um nome de variável awk aceitável)):

export file2
awk '{print}
     NR % 2 == 0 {if ((getline l < ENVIRON["file2"]) > 0) print l}
    ' "$file1"
    
por 11.01.2016 / 18:49
3

Se você não precisa preservar a ordem das pessoas que você pode fazer cat $file1 $file2 | sort

    
por 11.01.2016 / 18:35
2

Outro com awk

awk '
    FNR==NR{
        A[$1]=$0
        next
    }
    1
    !(NR%2){
        print A[$1]
    }
    ' file2 file1

Ou se os dois arquivos forem classificados corretamente (como usamos paste ) mais simples:

awk '
    1
    !(NR%2){
        getline <"file1"
        print
    }
    ' file1
    
por 11.01.2016 / 21:00