How to insert text alternatively from two files with a common pattern
Clash Royale CLAN TAG#URR8PPP
up vote
4
down vote
favorite
I have two files...
First File Input...
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.
Second File Input...
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.
I need Output like...
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.
I am using command ...
sed -e '/Ans./r file2' -e:n -e 'n;bn' -e file1
But the second o/p from 2 is reversed
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
shell-script text-processing sed
add a comment |Â
up vote
4
down vote
favorite
I have two files...
First File Input...
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.
Second File Input...
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.
I need Output like...
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.
I am using command ...
sed -e '/Ans./r file2' -e:n -e 'n;bn' -e file1
But the second o/p from 2 is reversed
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
shell-script text-processing sed
If you're happy with one or several of the answers, upvote them. If one is solving your issue, accepting it would be the best way of saying "Thank You!" :-)
â Kusalananda
Oct 12 '17 at 19:34
add a comment |Â
up vote
4
down vote
favorite
up vote
4
down vote
favorite
I have two files...
First File Input...
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.
Second File Input...
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.
I need Output like...
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.
I am using command ...
sed -e '/Ans./r file2' -e:n -e 'n;bn' -e file1
But the second o/p from 2 is reversed
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
shell-script text-processing sed
I have two files...
First File Input...
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.
Second File Input...
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.
I need Output like...
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.
I am using command ...
sed -e '/Ans./r file2' -e:n -e 'n;bn' -e file1
But the second o/p from 2 is reversed
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
shell-script text-processing sed
shell-script text-processing sed
edited Oct 9 '17 at 8:51
Philippos
5,93211546
5,93211546
asked Oct 9 '17 at 0:50
Pawan
212
212
If you're happy with one or several of the answers, upvote them. If one is solving your issue, accepting it would be the best way of saying "Thank You!" :-)
â Kusalananda
Oct 12 '17 at 19:34
add a comment |Â
If you're happy with one or several of the answers, upvote them. If one is solving your issue, accepting it would be the best way of saying "Thank You!" :-)
â Kusalananda
Oct 12 '17 at 19:34
If you're happy with one or several of the answers, upvote them. If one is solving your issue, accepting it would be the best way of saying "Thank You!" :-)
â Kusalananda
Oct 12 '17 at 19:34
If you're happy with one or several of the answers, upvote them. If one is solving your issue, accepting it would be the best way of saying "Thank You!" :-)
â Kusalananda
Oct 12 '17 at 19:34
add a comment |Â
3 Answers
3
active
oldest
votes
up vote
1
down vote
You can get pretty close using awk
in paragraph mode, with getline
(it doesn't quite preserve the record separators - you may be able to do better with GNU awk, using the RT
variable):
$ awk 'BEGINRS=""; ORS="nn" 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.
its Working fine
â Pawan
Oct 9 '17 at 16:56
1
@Pawan Then why not accept this as an answer?
â Philippos
Oct 11 '17 at 7:43
@Pawan Good! If this solves your issue, please consider accepting the answer.
â Kusalananda
Oct 12 '17 at 19:36
add a comment |Â
up vote
1
down vote
You may achieve this with awk
awk -v RS='' '
FNR == NR block[NR] = $0; next
print block[FNR] "nn" $0 "n"
' file1 file2
Blocks are separated by empty lines (RS=''
). First line (FNR == NR
) stores the blocks of file1
into the block
array. For each block of file2
, the second line prints the corresponding block in file1
then the block in file2
.
Notes:
- I'm assuming each file contains the same number of text blocks
- For a proper formatting, ensure that the last block in each file is followed by en empty line.
If there is a different number of blocks in each file, here is a (admittedly hackish) solution using bash
and GNU tools sed
and paste
:
paste -z -d 'n' <(sed -z 's/nn/nx00/g' file1) <(sed -z 's/nn/nnx00/g' file2)
The sed
commands append a zero byte to the block separators (empty lines). paste
uses that zero byte as a delimiter and prints each block in turn, separating them with a new line.
add a comment |Â
up vote
0
down vote
Here is a script and output to illustrate the use of standard utility paste for this. First the simple case of pasting lines alternately from 2 separate files. Then all we need to do is make the paragraph, stanza input into a single line and use the paste method. The gathering of lines in a group into a "superline" is done with a short perl script that transforms each line by replacing the newline with some other character, in this case "@". Then we paste, and then we separate the superlines back into paragraphs. This is a useful tehcnique because most *nix commands operate at the line level. It is useful enough, in fact, that at our shop we have a utility "masuli" to make such superlines.
The data files are smaller in the interest of conserving visual space.
#!/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/=/nn/g;s/nnn/nn/g'
exit 0
producing:
$ ./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
Best wishes ... cheers, drl
add a comment |Â
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
You can get pretty close using awk
in paragraph mode, with getline
(it doesn't quite preserve the record separators - you may be able to do better with GNU awk, using the RT
variable):
$ awk 'BEGINRS=""; ORS="nn" 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.
its Working fine
â Pawan
Oct 9 '17 at 16:56
1
@Pawan Then why not accept this as an answer?
â Philippos
Oct 11 '17 at 7:43
@Pawan Good! If this solves your issue, please consider accepting the answer.
â Kusalananda
Oct 12 '17 at 19:36
add a comment |Â
up vote
1
down vote
You can get pretty close using awk
in paragraph mode, with getline
(it doesn't quite preserve the record separators - you may be able to do better with GNU awk, using the RT
variable):
$ awk 'BEGINRS=""; ORS="nn" 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.
its Working fine
â Pawan
Oct 9 '17 at 16:56
1
@Pawan Then why not accept this as an answer?
â Philippos
Oct 11 '17 at 7:43
@Pawan Good! If this solves your issue, please consider accepting the answer.
â Kusalananda
Oct 12 '17 at 19:36
add a comment |Â
up vote
1
down vote
up vote
1
down vote
You can get pretty close using awk
in paragraph mode, with getline
(it doesn't quite preserve the record separators - you may be able to do better with GNU awk, using the RT
variable):
$ awk 'BEGINRS=""; ORS="nn" 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.
You can get pretty close using awk
in paragraph mode, with getline
(it doesn't quite preserve the record separators - you may be able to do better with GNU awk, using the RT
variable):
$ awk 'BEGINRS=""; ORS="nn" 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.
answered Oct 9 '17 at 1:25
steeldriver
32.1k34979
32.1k34979
its Working fine
â Pawan
Oct 9 '17 at 16:56
1
@Pawan Then why not accept this as an answer?
â Philippos
Oct 11 '17 at 7:43
@Pawan Good! If this solves your issue, please consider accepting the answer.
â Kusalananda
Oct 12 '17 at 19:36
add a comment |Â
its Working fine
â Pawan
Oct 9 '17 at 16:56
1
@Pawan Then why not accept this as an answer?
â Philippos
Oct 11 '17 at 7:43
@Pawan Good! If this solves your issue, please consider accepting the answer.
â Kusalananda
Oct 12 '17 at 19:36
its Working fine
â Pawan
Oct 9 '17 at 16:56
its Working fine
â Pawan
Oct 9 '17 at 16:56
1
1
@Pawan Then why not accept this as an answer?
â Philippos
Oct 11 '17 at 7:43
@Pawan Then why not accept this as an answer?
â Philippos
Oct 11 '17 at 7:43
@Pawan Good! If this solves your issue, please consider accepting the answer.
â Kusalananda
Oct 12 '17 at 19:36
@Pawan Good! If this solves your issue, please consider accepting the answer.
â Kusalananda
Oct 12 '17 at 19:36
add a comment |Â
up vote
1
down vote
You may achieve this with awk
awk -v RS='' '
FNR == NR block[NR] = $0; next
print block[FNR] "nn" $0 "n"
' file1 file2
Blocks are separated by empty lines (RS=''
). First line (FNR == NR
) stores the blocks of file1
into the block
array. For each block of file2
, the second line prints the corresponding block in file1
then the block in file2
.
Notes:
- I'm assuming each file contains the same number of text blocks
- For a proper formatting, ensure that the last block in each file is followed by en empty line.
If there is a different number of blocks in each file, here is a (admittedly hackish) solution using bash
and GNU tools sed
and paste
:
paste -z -d 'n' <(sed -z 's/nn/nx00/g' file1) <(sed -z 's/nn/nnx00/g' file2)
The sed
commands append a zero byte to the block separators (empty lines). paste
uses that zero byte as a delimiter and prints each block in turn, separating them with a new line.
add a comment |Â
up vote
1
down vote
You may achieve this with awk
awk -v RS='' '
FNR == NR block[NR] = $0; next
print block[FNR] "nn" $0 "n"
' file1 file2
Blocks are separated by empty lines (RS=''
). First line (FNR == NR
) stores the blocks of file1
into the block
array. For each block of file2
, the second line prints the corresponding block in file1
then the block in file2
.
Notes:
- I'm assuming each file contains the same number of text blocks
- For a proper formatting, ensure that the last block in each file is followed by en empty line.
If there is a different number of blocks in each file, here is a (admittedly hackish) solution using bash
and GNU tools sed
and paste
:
paste -z -d 'n' <(sed -z 's/nn/nx00/g' file1) <(sed -z 's/nn/nnx00/g' file2)
The sed
commands append a zero byte to the block separators (empty lines). paste
uses that zero byte as a delimiter and prints each block in turn, separating them with a new line.
add a comment |Â
up vote
1
down vote
up vote
1
down vote
You may achieve this with awk
awk -v RS='' '
FNR == NR block[NR] = $0; next
print block[FNR] "nn" $0 "n"
' file1 file2
Blocks are separated by empty lines (RS=''
). First line (FNR == NR
) stores the blocks of file1
into the block
array. For each block of file2
, the second line prints the corresponding block in file1
then the block in file2
.
Notes:
- I'm assuming each file contains the same number of text blocks
- For a proper formatting, ensure that the last block in each file is followed by en empty line.
If there is a different number of blocks in each file, here is a (admittedly hackish) solution using bash
and GNU tools sed
and paste
:
paste -z -d 'n' <(sed -z 's/nn/nx00/g' file1) <(sed -z 's/nn/nnx00/g' file2)
The sed
commands append a zero byte to the block separators (empty lines). paste
uses that zero byte as a delimiter and prints each block in turn, separating them with a new line.
You may achieve this with awk
awk -v RS='' '
FNR == NR block[NR] = $0; next
print block[FNR] "nn" $0 "n"
' file1 file2
Blocks are separated by empty lines (RS=''
). First line (FNR == NR
) stores the blocks of file1
into the block
array. For each block of file2
, the second line prints the corresponding block in file1
then the block in file2
.
Notes:
- I'm assuming each file contains the same number of text blocks
- For a proper formatting, ensure that the last block in each file is followed by en empty line.
If there is a different number of blocks in each file, here is a (admittedly hackish) solution using bash
and GNU tools sed
and paste
:
paste -z -d 'n' <(sed -z 's/nn/nx00/g' file1) <(sed -z 's/nn/nnx00/g' file2)
The sed
commands append a zero byte to the block separators (empty lines). paste
uses that zero byte as a delimiter and prints each block in turn, separating them with a new line.
edited Oct 9 '17 at 1:49
answered Oct 9 '17 at 0:55
xhienne
11.7k2553
11.7k2553
add a comment |Â
add a comment |Â
up vote
0
down vote
Here is a script and output to illustrate the use of standard utility paste for this. First the simple case of pasting lines alternately from 2 separate files. Then all we need to do is make the paragraph, stanza input into a single line and use the paste method. The gathering of lines in a group into a "superline" is done with a short perl script that transforms each line by replacing the newline with some other character, in this case "@". Then we paste, and then we separate the superlines back into paragraphs. This is a useful tehcnique because most *nix commands operate at the line level. It is useful enough, in fact, that at our shop we have a utility "masuli" to make such superlines.
The data files are smaller in the interest of conserving visual space.
#!/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/=/nn/g;s/nnn/nn/g'
exit 0
producing:
$ ./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
Best wishes ... cheers, drl
add a comment |Â
up vote
0
down vote
Here is a script and output to illustrate the use of standard utility paste for this. First the simple case of pasting lines alternately from 2 separate files. Then all we need to do is make the paragraph, stanza input into a single line and use the paste method. The gathering of lines in a group into a "superline" is done with a short perl script that transforms each line by replacing the newline with some other character, in this case "@". Then we paste, and then we separate the superlines back into paragraphs. This is a useful tehcnique because most *nix commands operate at the line level. It is useful enough, in fact, that at our shop we have a utility "masuli" to make such superlines.
The data files are smaller in the interest of conserving visual space.
#!/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/=/nn/g;s/nnn/nn/g'
exit 0
producing:
$ ./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
Best wishes ... cheers, drl
add a comment |Â
up vote
0
down vote
up vote
0
down vote
Here is a script and output to illustrate the use of standard utility paste for this. First the simple case of pasting lines alternately from 2 separate files. Then all we need to do is make the paragraph, stanza input into a single line and use the paste method. The gathering of lines in a group into a "superline" is done with a short perl script that transforms each line by replacing the newline with some other character, in this case "@". Then we paste, and then we separate the superlines back into paragraphs. This is a useful tehcnique because most *nix commands operate at the line level. It is useful enough, in fact, that at our shop we have a utility "masuli" to make such superlines.
The data files are smaller in the interest of conserving visual space.
#!/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/=/nn/g;s/nnn/nn/g'
exit 0
producing:
$ ./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
Best wishes ... cheers, drl
Here is a script and output to illustrate the use of standard utility paste for this. First the simple case of pasting lines alternately from 2 separate files. Then all we need to do is make the paragraph, stanza input into a single line and use the paste method. The gathering of lines in a group into a "superline" is done with a short perl script that transforms each line by replacing the newline with some other character, in this case "@". Then we paste, and then we separate the superlines back into paragraphs. This is a useful tehcnique because most *nix commands operate at the line level. It is useful enough, in fact, that at our shop we have a utility "masuli" to make such superlines.
The data files are smaller in the interest of conserving visual space.
#!/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/=/nn/g;s/nnn/nn/g'
exit 0
producing:
$ ./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
Best wishes ... cheers, drl
answered Oct 9 '17 at 16:57
drl
45225
45225
add a comment |Â
add a comment |Â
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f396913%2fhow-to-insert-text-alternatively-from-two-files-with-a-common-pattern%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
If you're happy with one or several of the answers, upvote them. If one is solving your issue, accepting it would be the best way of saying "Thank You!" :-)
â Kusalananda
Oct 12 '17 at 19:34