How to merge two files as alternative lines?
up vote
2
down vote
favorite
I know how to merge two tables to print alternative lines in a new file, but I want to merge every two lines from file1.txt with one line from file2.txt. As an example:
file1.txt is
A a aa
B b bb
C c cc
D d dd
and file2.txt is
E e ee
F f ff
I want to have
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
text-processing merge
add a comment |
up vote
2
down vote
favorite
I know how to merge two tables to print alternative lines in a new file, but I want to merge every two lines from file1.txt with one line from file2.txt. As an example:
file1.txt is
A a aa
B b bb
C c cc
D d dd
and file2.txt is
E e ee
F f ff
I want to have
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
text-processing merge
you want the same order u mentioned?? A, B, E, C, D, F??
– PRATAP
2 days ago
1
What to do if lines amount in file1.txt smaller than amount in file2.txt ?
– S_Flash
2 days ago
Please help us help you by answering our questions :-) It is best to answer our questions by editing your original question: "Edit 1: ...; Edit 2: ..."
– sudodus
2 days ago
@PRATAP yes, I want the same order of my example.
– Negar
yesterday
add a comment |
up vote
2
down vote
favorite
up vote
2
down vote
favorite
I know how to merge two tables to print alternative lines in a new file, but I want to merge every two lines from file1.txt with one line from file2.txt. As an example:
file1.txt is
A a aa
B b bb
C c cc
D d dd
and file2.txt is
E e ee
F f ff
I want to have
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
text-processing merge
I know how to merge two tables to print alternative lines in a new file, but I want to merge every two lines from file1.txt with one line from file2.txt. As an example:
file1.txt is
A a aa
B b bb
C c cc
D d dd
and file2.txt is
E e ee
F f ff
I want to have
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
text-processing merge
text-processing merge
edited 2 days ago
muru
134k19282483
134k19282483
asked 2 days ago
Negar
163
163
you want the same order u mentioned?? A, B, E, C, D, F??
– PRATAP
2 days ago
1
What to do if lines amount in file1.txt smaller than amount in file2.txt ?
– S_Flash
2 days ago
Please help us help you by answering our questions :-) It is best to answer our questions by editing your original question: "Edit 1: ...; Edit 2: ..."
– sudodus
2 days ago
@PRATAP yes, I want the same order of my example.
– Negar
yesterday
add a comment |
you want the same order u mentioned?? A, B, E, C, D, F??
– PRATAP
2 days ago
1
What to do if lines amount in file1.txt smaller than amount in file2.txt ?
– S_Flash
2 days ago
Please help us help you by answering our questions :-) It is best to answer our questions by editing your original question: "Edit 1: ...; Edit 2: ..."
– sudodus
2 days ago
@PRATAP yes, I want the same order of my example.
– Negar
yesterday
you want the same order u mentioned?? A, B, E, C, D, F??
– PRATAP
2 days ago
you want the same order u mentioned?? A, B, E, C, D, F??
– PRATAP
2 days ago
1
1
What to do if lines amount in file1.txt smaller than amount in file2.txt ?
– S_Flash
2 days ago
What to do if lines amount in file1.txt smaller than amount in file2.txt ?
– S_Flash
2 days ago
Please help us help you by answering our questions :-) It is best to answer our questions by editing your original question: "Edit 1: ...; Edit 2: ..."
– sudodus
2 days ago
Please help us help you by answering our questions :-) It is best to answer our questions by editing your original question: "Edit 1: ...; Edit 2: ..."
– sudodus
2 days ago
@PRATAP yes, I want the same order of my example.
– Negar
yesterday
@PRATAP yes, I want the same order of my example.
– Negar
yesterday
add a comment |
3 Answers
3
active
oldest
votes
up vote
6
down vote
Using GNU sed, you can read and insert one line from the second file after every other line ("two skip two") of the first:
$ sed '2~2R file2.txt' file1.txt
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
Slightly more long-winded implementation of the same in awk:
awk '{print} !(NR%2) {if ((getline < "file2.txt") > -1) print}' file1.txt
add a comment |
up vote
5
down vote
You can use the paste
command for this:
% paste -d 'n' - - file2.txt < file1.txt
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
paste
, by default, takes lines from each input file, then merges them into a single line separated by tabs. Using -d 'n'
, we tell it to use newlines as the separator instead. -
is standard input, which is redirected in from file1.txt
(< file1.txt
). So paste
takes one line from standard input, then another line from standard input (effectively two lines from file1.txt
, then a line from file2.txt
and prints them out separated by newlines.
It works! thanks. but, If two files have different number of columns, it prints blanket lines. how can I solve it?
– Negar
2 days ago
1
Can you update your post with such an example?
– muru
2 days ago
1
@Negar, do you mean different number of columns or 'not matching number of lines'? And what action do you want in such cases (when the files do not match)?
– sudodus
2 days ago
@Negar columns or rows? Again, please post a relevant example in your question.
– muru
yesterday
1
@ sudodus Assume file1 has 30 rows and file2 has 10 rows. Then I want tho have a file including 40 rows. I want to have the first 20 rows alternatively plus final 20 rows of file1
– Negar
yesterday
|
show 1 more comment
up vote
2
down vote
Original shellscript
I thought the following script would do it. The trick is to open the two files on separate file descriptors (here #4 and #5).
#!/bin/bash
while read -r -u 4 line1 && read -r -u 4 line2 && read -r -u 5 line3
do
echo "$line1"
echo "$line2"
echo "$line3"
done 4<file1.txt 5<file2.txt
Test
Make the script executable and run it,
$ ./script
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
The original script stops, when reading to the end of file in one of the input files (so that only matching 2+1 lines are written to the output).
Modified shellscript
The following script will continue reading and writing until all the files have reached end of file (so that all available lines are written to the output). This should match what the OP wants.
#!/bin/bash
end1=false
end2=false
cont=true
while $cont
do
read -r -u 4 line1
if [ $? -eq 0 ]
then
echo "$line1"
else
end1=true
fi
read -r -u 4 line2
if [ $? -eq 0 ]
then
echo "$line2"
else
end1=true
fi
read -r -u 5 line3
if [ $? -eq 0 ]
then
echo "$line3"
else
end2=true
fi
if $end1 && $end2 # modify this line to change when to stop
then
cont=false
fi
done 4<file1.txt 5<file2.txt
add a comment |
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
6
down vote
Using GNU sed, you can read and insert one line from the second file after every other line ("two skip two") of the first:
$ sed '2~2R file2.txt' file1.txt
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
Slightly more long-winded implementation of the same in awk:
awk '{print} !(NR%2) {if ((getline < "file2.txt") > -1) print}' file1.txt
add a comment |
up vote
6
down vote
Using GNU sed, you can read and insert one line from the second file after every other line ("two skip two") of the first:
$ sed '2~2R file2.txt' file1.txt
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
Slightly more long-winded implementation of the same in awk:
awk '{print} !(NR%2) {if ((getline < "file2.txt") > -1) print}' file1.txt
add a comment |
up vote
6
down vote
up vote
6
down vote
Using GNU sed, you can read and insert one line from the second file after every other line ("two skip two") of the first:
$ sed '2~2R file2.txt' file1.txt
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
Slightly more long-winded implementation of the same in awk:
awk '{print} !(NR%2) {if ((getline < "file2.txt") > -1) print}' file1.txt
Using GNU sed, you can read and insert one line from the second file after every other line ("two skip two") of the first:
$ sed '2~2R file2.txt' file1.txt
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
Slightly more long-winded implementation of the same in awk:
awk '{print} !(NR%2) {if ((getline < "file2.txt") > -1) print}' file1.txt
edited 2 days ago
answered 2 days ago
steeldriver
64.7k11102173
64.7k11102173
add a comment |
add a comment |
up vote
5
down vote
You can use the paste
command for this:
% paste -d 'n' - - file2.txt < file1.txt
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
paste
, by default, takes lines from each input file, then merges them into a single line separated by tabs. Using -d 'n'
, we tell it to use newlines as the separator instead. -
is standard input, which is redirected in from file1.txt
(< file1.txt
). So paste
takes one line from standard input, then another line from standard input (effectively two lines from file1.txt
, then a line from file2.txt
and prints them out separated by newlines.
It works! thanks. but, If two files have different number of columns, it prints blanket lines. how can I solve it?
– Negar
2 days ago
1
Can you update your post with such an example?
– muru
2 days ago
1
@Negar, do you mean different number of columns or 'not matching number of lines'? And what action do you want in such cases (when the files do not match)?
– sudodus
2 days ago
@Negar columns or rows? Again, please post a relevant example in your question.
– muru
yesterday
1
@ sudodus Assume file1 has 30 rows and file2 has 10 rows. Then I want tho have a file including 40 rows. I want to have the first 20 rows alternatively plus final 20 rows of file1
– Negar
yesterday
|
show 1 more comment
up vote
5
down vote
You can use the paste
command for this:
% paste -d 'n' - - file2.txt < file1.txt
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
paste
, by default, takes lines from each input file, then merges them into a single line separated by tabs. Using -d 'n'
, we tell it to use newlines as the separator instead. -
is standard input, which is redirected in from file1.txt
(< file1.txt
). So paste
takes one line from standard input, then another line from standard input (effectively two lines from file1.txt
, then a line from file2.txt
and prints them out separated by newlines.
It works! thanks. but, If two files have different number of columns, it prints blanket lines. how can I solve it?
– Negar
2 days ago
1
Can you update your post with such an example?
– muru
2 days ago
1
@Negar, do you mean different number of columns or 'not matching number of lines'? And what action do you want in such cases (when the files do not match)?
– sudodus
2 days ago
@Negar columns or rows? Again, please post a relevant example in your question.
– muru
yesterday
1
@ sudodus Assume file1 has 30 rows and file2 has 10 rows. Then I want tho have a file including 40 rows. I want to have the first 20 rows alternatively plus final 20 rows of file1
– Negar
yesterday
|
show 1 more comment
up vote
5
down vote
up vote
5
down vote
You can use the paste
command for this:
% paste -d 'n' - - file2.txt < file1.txt
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
paste
, by default, takes lines from each input file, then merges them into a single line separated by tabs. Using -d 'n'
, we tell it to use newlines as the separator instead. -
is standard input, which is redirected in from file1.txt
(< file1.txt
). So paste
takes one line from standard input, then another line from standard input (effectively two lines from file1.txt
, then a line from file2.txt
and prints them out separated by newlines.
You can use the paste
command for this:
% paste -d 'n' - - file2.txt < file1.txt
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
paste
, by default, takes lines from each input file, then merges them into a single line separated by tabs. Using -d 'n'
, we tell it to use newlines as the separator instead. -
is standard input, which is redirected in from file1.txt
(< file1.txt
). So paste
takes one line from standard input, then another line from standard input (effectively two lines from file1.txt
, then a line from file2.txt
and prints them out separated by newlines.
answered 2 days ago
muru
134k19282483
134k19282483
It works! thanks. but, If two files have different number of columns, it prints blanket lines. how can I solve it?
– Negar
2 days ago
1
Can you update your post with such an example?
– muru
2 days ago
1
@Negar, do you mean different number of columns or 'not matching number of lines'? And what action do you want in such cases (when the files do not match)?
– sudodus
2 days ago
@Negar columns or rows? Again, please post a relevant example in your question.
– muru
yesterday
1
@ sudodus Assume file1 has 30 rows and file2 has 10 rows. Then I want tho have a file including 40 rows. I want to have the first 20 rows alternatively plus final 20 rows of file1
– Negar
yesterday
|
show 1 more comment
It works! thanks. but, If two files have different number of columns, it prints blanket lines. how can I solve it?
– Negar
2 days ago
1
Can you update your post with such an example?
– muru
2 days ago
1
@Negar, do you mean different number of columns or 'not matching number of lines'? And what action do you want in such cases (when the files do not match)?
– sudodus
2 days ago
@Negar columns or rows? Again, please post a relevant example in your question.
– muru
yesterday
1
@ sudodus Assume file1 has 30 rows and file2 has 10 rows. Then I want tho have a file including 40 rows. I want to have the first 20 rows alternatively plus final 20 rows of file1
– Negar
yesterday
It works! thanks. but, If two files have different number of columns, it prints blanket lines. how can I solve it?
– Negar
2 days ago
It works! thanks. but, If two files have different number of columns, it prints blanket lines. how can I solve it?
– Negar
2 days ago
1
1
Can you update your post with such an example?
– muru
2 days ago
Can you update your post with such an example?
– muru
2 days ago
1
1
@Negar, do you mean different number of columns or 'not matching number of lines'? And what action do you want in such cases (when the files do not match)?
– sudodus
2 days ago
@Negar, do you mean different number of columns or 'not matching number of lines'? And what action do you want in such cases (when the files do not match)?
– sudodus
2 days ago
@Negar columns or rows? Again, please post a relevant example in your question.
– muru
yesterday
@Negar columns or rows? Again, please post a relevant example in your question.
– muru
yesterday
1
1
@ sudodus Assume file1 has 30 rows and file2 has 10 rows. Then I want tho have a file including 40 rows. I want to have the first 20 rows alternatively plus final 20 rows of file1
– Negar
yesterday
@ sudodus Assume file1 has 30 rows and file2 has 10 rows. Then I want tho have a file including 40 rows. I want to have the first 20 rows alternatively plus final 20 rows of file1
– Negar
yesterday
|
show 1 more comment
up vote
2
down vote
Original shellscript
I thought the following script would do it. The trick is to open the two files on separate file descriptors (here #4 and #5).
#!/bin/bash
while read -r -u 4 line1 && read -r -u 4 line2 && read -r -u 5 line3
do
echo "$line1"
echo "$line2"
echo "$line3"
done 4<file1.txt 5<file2.txt
Test
Make the script executable and run it,
$ ./script
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
The original script stops, when reading to the end of file in one of the input files (so that only matching 2+1 lines are written to the output).
Modified shellscript
The following script will continue reading and writing until all the files have reached end of file (so that all available lines are written to the output). This should match what the OP wants.
#!/bin/bash
end1=false
end2=false
cont=true
while $cont
do
read -r -u 4 line1
if [ $? -eq 0 ]
then
echo "$line1"
else
end1=true
fi
read -r -u 4 line2
if [ $? -eq 0 ]
then
echo "$line2"
else
end1=true
fi
read -r -u 5 line3
if [ $? -eq 0 ]
then
echo "$line3"
else
end2=true
fi
if $end1 && $end2 # modify this line to change when to stop
then
cont=false
fi
done 4<file1.txt 5<file2.txt
add a comment |
up vote
2
down vote
Original shellscript
I thought the following script would do it. The trick is to open the two files on separate file descriptors (here #4 and #5).
#!/bin/bash
while read -r -u 4 line1 && read -r -u 4 line2 && read -r -u 5 line3
do
echo "$line1"
echo "$line2"
echo "$line3"
done 4<file1.txt 5<file2.txt
Test
Make the script executable and run it,
$ ./script
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
The original script stops, when reading to the end of file in one of the input files (so that only matching 2+1 lines are written to the output).
Modified shellscript
The following script will continue reading and writing until all the files have reached end of file (so that all available lines are written to the output). This should match what the OP wants.
#!/bin/bash
end1=false
end2=false
cont=true
while $cont
do
read -r -u 4 line1
if [ $? -eq 0 ]
then
echo "$line1"
else
end1=true
fi
read -r -u 4 line2
if [ $? -eq 0 ]
then
echo "$line2"
else
end1=true
fi
read -r -u 5 line3
if [ $? -eq 0 ]
then
echo "$line3"
else
end2=true
fi
if $end1 && $end2 # modify this line to change when to stop
then
cont=false
fi
done 4<file1.txt 5<file2.txt
add a comment |
up vote
2
down vote
up vote
2
down vote
Original shellscript
I thought the following script would do it. The trick is to open the two files on separate file descriptors (here #4 and #5).
#!/bin/bash
while read -r -u 4 line1 && read -r -u 4 line2 && read -r -u 5 line3
do
echo "$line1"
echo "$line2"
echo "$line3"
done 4<file1.txt 5<file2.txt
Test
Make the script executable and run it,
$ ./script
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
The original script stops, when reading to the end of file in one of the input files (so that only matching 2+1 lines are written to the output).
Modified shellscript
The following script will continue reading and writing until all the files have reached end of file (so that all available lines are written to the output). This should match what the OP wants.
#!/bin/bash
end1=false
end2=false
cont=true
while $cont
do
read -r -u 4 line1
if [ $? -eq 0 ]
then
echo "$line1"
else
end1=true
fi
read -r -u 4 line2
if [ $? -eq 0 ]
then
echo "$line2"
else
end1=true
fi
read -r -u 5 line3
if [ $? -eq 0 ]
then
echo "$line3"
else
end2=true
fi
if $end1 && $end2 # modify this line to change when to stop
then
cont=false
fi
done 4<file1.txt 5<file2.txt
Original shellscript
I thought the following script would do it. The trick is to open the two files on separate file descriptors (here #4 and #5).
#!/bin/bash
while read -r -u 4 line1 && read -r -u 4 line2 && read -r -u 5 line3
do
echo "$line1"
echo "$line2"
echo "$line3"
done 4<file1.txt 5<file2.txt
Test
Make the script executable and run it,
$ ./script
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
The original script stops, when reading to the end of file in one of the input files (so that only matching 2+1 lines are written to the output).
Modified shellscript
The following script will continue reading and writing until all the files have reached end of file (so that all available lines are written to the output). This should match what the OP wants.
#!/bin/bash
end1=false
end2=false
cont=true
while $cont
do
read -r -u 4 line1
if [ $? -eq 0 ]
then
echo "$line1"
else
end1=true
fi
read -r -u 4 line2
if [ $? -eq 0 ]
then
echo "$line2"
else
end1=true
fi
read -r -u 5 line3
if [ $? -eq 0 ]
then
echo "$line3"
else
end2=true
fi
if $end1 && $end2 # modify this line to change when to stop
then
cont=false
fi
done 4<file1.txt 5<file2.txt
edited yesterday
answered 2 days ago
sudodus
21.4k32770
21.4k32770
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
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2faskubuntu.com%2fquestions%2f1095842%2fhow-to-merge-two-files-as-alternative-lines%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
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
Required, but never shown
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
Required, but never shown
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
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
you want the same order u mentioned?? A, B, E, C, D, F??
– PRATAP
2 days ago
1
What to do if lines amount in file1.txt smaller than amount in file2.txt ?
– S_Flash
2 days ago
Please help us help you by answering our questions :-) It is best to answer our questions by editing your original question: "Edit 1: ...; Edit 2: ..."
– sudodus
2 days ago
@PRATAP yes, I want the same order of my example.
– Negar
yesterday