Como inserir texto alternativamente de dois arquivos com um padrão comum

4

Eu tenho dois arquivos ...

Primeira entrada de arquivo ...

1 How many steps are in programming?
A.5
B.4
C.3
D.9
Ans.

2 How many stairs in room?
A.6
B.10
C.15
D.23
Ans.

Segunda entrada de arquivo ...

1. Who is outside of the room ?
A.john
B.Mary
C.Scot
D.Fery
Ans.

2. Which day is today ?
A.Mon
B.Wed
C.Friday
D.Sunday
Ans.

Eu preciso do Output como ...

1 How many steps are in programming?
A.5
B.4
C.3
D.9
Ans.

1. Who is outside of the room ?
A.john
B.Mary
C.Scot
D.Fery
Ans.

2 How many stairs in room?
A.6
B.10
C.15
D.23
Ans.

2. Which day is today ?
A.Mon
B.Wed
C.Friday
D.Sunday
Ans.

Estou usando o comando ...

sed -e '/Ans./{r file2' -e:n -e 'n;bn' -e \} file1

Mas o segundo o / p de 2 é invertido

1 How many steps are in programming?
A.5
B.4
C.3
D.9
Ans.

1. Who is outside of the room ?
A.john
B.Mary
C.Scot
D.Fery
Ans.

**2. Which day is today ?**
A.Mon
B.Wed
C.Friday
D.Sunday
Ans.

**2 How many stairs in room?**
A.6
B.10
C.15
D.23
    
por Pawan 09.10.2017 / 02:50

3 respostas

1

Você pode se aproximar usando awk no modo de parágrafo, com getline (ele não preserva os separadores de registro - você pode fazer melhor com o GNU awk, usando a variável RT ):

$ awk 'BEGIN{RS=""; ORS="\n\n"} {print; if( (getline < "second") > -1) print}' first
1 How many steps are in programming?
A.5
B.4
C.3
D.9
Ans.

1. Who is outside of the room ?
A.john
B.Mary
C.Scot
D.Fery
Ans.

2 How many stairs in room?
A.6
B.10
C.15
D.23
Ans.

2. Which day is today ?
A.Mon
B.Wed
C.Friday
D.Sunday
Ans.
    
por 09.10.2017 / 03:25
1

Você pode conseguir isso com awk

awk -v RS='' '
    FNR == NR { block[NR] = $0; next }
    { print block[FNR] "\n\n" $0 "\n" }
' file1 file2

Os blocos são separados por linhas vazias ( RS='' ). A primeira linha ( FNR == NR ) armazena os blocos de file1 na matriz block . Para cada bloco de file2 , a segunda linha imprime o bloco correspondente em file1 , depois o bloco em file2 .

Notas:

  • Estou assumindo que cada arquivo contém o mesmo número de blocos de texto
  • Para uma formatação adequada, certifique-se de que o último bloco em cada arquivo seja seguido por uma linha vazia.

Se houver um número diferente de blocos em cada arquivo, aqui está uma solução (reconhecidamente hackish) usando bash e as ferramentas GNU sed e paste :

paste -z -d '\n' <(sed -z 's/\n\n/\n\x00/g' file1) <(sed -z 's/\n\n/\n\n\x00/g' file2)

Os comandos sed adicionam um byte zero aos separadores de bloco (linhas vazias). paste usa esse zero byte como um delimitador e imprime cada bloco por vez, separando-os com uma nova linha.

    
por 09.10.2017 / 02:55
0

Aqui está um script e uma saída para ilustrar o uso de pasta padrão de utilitário para isso. Primeiro, o caso simples de colar linhas alternadamente de dois arquivos separados. Então, tudo o que precisamos fazer é tornar o parágrafo, a entrada de sub-rotinas em uma única linha e usar o método paste. A coleta de linhas em um grupo em uma "superline" é feita com um pequeno script em perl que transforma cada linha substituindo a nova linha por algum outro caractere, neste caso "@". Em seguida, colamos e depois separamos as superlines de volta aos parágrafos. Esta é uma técnica útil porque a maioria dos comandos * nix operam no nível da linha. É bastante útil, na verdade, que em nossa loja tenhamos um utilitário "masuli" para fazer tais superlines.

Os arquivos de dados são menores no interesse de conservar o espaço visual.

#!/usr/bin/env bash

# @(#) s1       Demonstrate modular approach to multi-line data, perl, paste.

# Utility functions: print-as-echo, print-line-with-visual-space, debug.
# export PATH="/usr/local/bin:/usr/bin:/bin"
LC_ALL=C ; LANG=C ; export LC_ALL LANG
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }
em() { pe "$*" >&2 ; }
db() { ( printf " db, ";for _i;do printf "%s" "$_i";done;printf "\n" ) >&2 ; }
db() { : ; }
C=$HOME/bin/context && [ -f $C ] && $C paste perl

pl " Input data file data[12]:"
 head data[12]

pl " Results, proof of concept:"
paste -d'\n' data[12]

pl " Input data files data[34]:"
head data[34]

pl " Results, collect, paste, separate:"
paste -d'\n' <( perl -00 -wp -e 's/\n/@/g;s/@@/=\n/' data3 ) \
             <( perl -00 -wp -e 's/\n/@/g;s/@@/=\n/' data4 ) |
tee f1 |
perl -000 -wp -e 's/@/\n/g;s/=/\n\n/g;s/\n\n\n/\n\n/g'

exit 0

produzindo:

$ ./s1

Environment: LC_ALL = C, LANG = C
(Versions displayed with local utility "version")
OS, ker|rel, machine: Linux, 3.16.0-4-amd64, x86_64
Distribution        : Debian 8.9 (jessie) 
bash GNU bash 4.3.30
paste (GNU coreutils) 8.23
perl 5.20.2

-----
 Input data file data[12]:
==> data1 <==
1.1
1.2

==> data2 <==
2.1
2.2

-----
 Results, proof of concept:
1.1
2.1
1.2
2.2

-----
 Input data files data[34]:
==> data3 <==
3.1a
3.1b

3.2a
3.2b


==> data4 <==
4.1a
4.1b

4.2a
4.2b


-----
 Results, collect, paste, separate:
3.1a
3.1b

4.1a
4.1b

3.2a
3.2b

4.2a
4.2b

Felicidades ... felicidades, drl

    
por 09.10.2017 / 18:57