Bash - pair each line of file
This question is strongly related to this and this question. I have a file that contains several lines where each line is a path to a file. Now I want to pair each line with each different line (not itself). Also a pair A B
is equal to a B A
pair for my purposes, so only one of these combinations should be produced.
Example
files.dat
reads like this in a shorthand notation, each letter is a file path (absolute or relative)
a
b
c
d
e
Then my result should look something like this:
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
Preferrably I would like to solve this in bash. Unlike the other questions, my file list is rather small (about 200 lines), so using loops and RAM capacity
pose no problems.
shell-script text-processing
add a comment |
This question is strongly related to this and this question. I have a file that contains several lines where each line is a path to a file. Now I want to pair each line with each different line (not itself). Also a pair A B
is equal to a B A
pair for my purposes, so only one of these combinations should be produced.
Example
files.dat
reads like this in a shorthand notation, each letter is a file path (absolute or relative)
a
b
c
d
e
Then my result should look something like this:
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
Preferrably I would like to solve this in bash. Unlike the other questions, my file list is rather small (about 200 lines), so using loops and RAM capacity
pose no problems.
shell-script text-processing
Does it have to be in bash proper, or just something available via the bash commandline? Other utilities are better positioned to process text.
– Jeff Schaller
Mar 17 at 14:15
@JeffSchaller Something accessible via the bash commandline. I was a bit unclear, sorry
– Enno
Mar 17 at 14:17
This is almost becoming a Code Golf :P
– Richard de Wit
Mar 18 at 11:22
3
As a general rule, as long as you need to do something non-trivial, use your favourite scripting language over BASH. It will be less fragile (for example, against special characters or spaces), and much easier to expand whenever you need it (if you need three, or filter some of them away). Python or Perl should be installed in almost any Linux box, so they are good choices (unless you are working on embedded systems, like Busybox).
– Davidmh
Mar 18 at 12:26
add a comment |
This question is strongly related to this and this question. I have a file that contains several lines where each line is a path to a file. Now I want to pair each line with each different line (not itself). Also a pair A B
is equal to a B A
pair for my purposes, so only one of these combinations should be produced.
Example
files.dat
reads like this in a shorthand notation, each letter is a file path (absolute or relative)
a
b
c
d
e
Then my result should look something like this:
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
Preferrably I would like to solve this in bash. Unlike the other questions, my file list is rather small (about 200 lines), so using loops and RAM capacity
pose no problems.
shell-script text-processing
This question is strongly related to this and this question. I have a file that contains several lines where each line is a path to a file. Now I want to pair each line with each different line (not itself). Also a pair A B
is equal to a B A
pair for my purposes, so only one of these combinations should be produced.
Example
files.dat
reads like this in a shorthand notation, each letter is a file path (absolute or relative)
a
b
c
d
e
Then my result should look something like this:
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
Preferrably I would like to solve this in bash. Unlike the other questions, my file list is rather small (about 200 lines), so using loops and RAM capacity
pose no problems.
shell-script text-processing
shell-script text-processing
edited Mar 17 at 14:18
Jeff Schaller
43.8k1161141
43.8k1161141
asked Mar 17 at 14:14
EnnoEnno
1534
1534
Does it have to be in bash proper, or just something available via the bash commandline? Other utilities are better positioned to process text.
– Jeff Schaller
Mar 17 at 14:15
@JeffSchaller Something accessible via the bash commandline. I was a bit unclear, sorry
– Enno
Mar 17 at 14:17
This is almost becoming a Code Golf :P
– Richard de Wit
Mar 18 at 11:22
3
As a general rule, as long as you need to do something non-trivial, use your favourite scripting language over BASH. It will be less fragile (for example, against special characters or spaces), and much easier to expand whenever you need it (if you need three, or filter some of them away). Python or Perl should be installed in almost any Linux box, so they are good choices (unless you are working on embedded systems, like Busybox).
– Davidmh
Mar 18 at 12:26
add a comment |
Does it have to be in bash proper, or just something available via the bash commandline? Other utilities are better positioned to process text.
– Jeff Schaller
Mar 17 at 14:15
@JeffSchaller Something accessible via the bash commandline. I was a bit unclear, sorry
– Enno
Mar 17 at 14:17
This is almost becoming a Code Golf :P
– Richard de Wit
Mar 18 at 11:22
3
As a general rule, as long as you need to do something non-trivial, use your favourite scripting language over BASH. It will be less fragile (for example, against special characters or spaces), and much easier to expand whenever you need it (if you need three, or filter some of them away). Python or Perl should be installed in almost any Linux box, so they are good choices (unless you are working on embedded systems, like Busybox).
– Davidmh
Mar 18 at 12:26
Does it have to be in bash proper, or just something available via the bash commandline? Other utilities are better positioned to process text.
– Jeff Schaller
Mar 17 at 14:15
Does it have to be in bash proper, or just something available via the bash commandline? Other utilities are better positioned to process text.
– Jeff Schaller
Mar 17 at 14:15
@JeffSchaller Something accessible via the bash commandline. I was a bit unclear, sorry
– Enno
Mar 17 at 14:17
@JeffSchaller Something accessible via the bash commandline. I was a bit unclear, sorry
– Enno
Mar 17 at 14:17
This is almost becoming a Code Golf :P
– Richard de Wit
Mar 18 at 11:22
This is almost becoming a Code Golf :P
– Richard de Wit
Mar 18 at 11:22
3
3
As a general rule, as long as you need to do something non-trivial, use your favourite scripting language over BASH. It will be less fragile (for example, against special characters or spaces), and much easier to expand whenever you need it (if you need three, or filter some of them away). Python or Perl should be installed in almost any Linux box, so they are good choices (unless you are working on embedded systems, like Busybox).
– Davidmh
Mar 18 at 12:26
As a general rule, as long as you need to do something non-trivial, use your favourite scripting language over BASH. It will be less fragile (for example, against special characters or spaces), and much easier to expand whenever you need it (if you need three, or filter some of them away). Python or Perl should be installed in almost any Linux box, so they are good choices (unless you are working on embedded systems, like Busybox).
– Davidmh
Mar 18 at 12:26
add a comment |
6 Answers
6
active
oldest
votes
Use this command:
awk '{ name[$1]++ }
END { PROCINFO["sorted_in"] = "@ind_str_asc"
for (v1 in name) for (v2 in name) if (v1 < v2) print v1, v2 }
' files.dat
PROCINFO
may be a gawk
extension.
If your awk
doesn’t support it,
just leave out the PROCINFO["sorted_in"] = "@ind_str_asc"
line
and pipe the output into sort
(if you want the output sorted).
(This does not require the input to be sorted.)
add a comment |
$ join -j 2 -o 1.1,2.1 file file | awk '!seen[$1,$2]++ && !seen[$2,$1]++'
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
This assumes that no line in the input file contains any whitespace. It also assumes that the file is sorted.
The join
command creates the full cross product of the lines in the file. It does this by joining the file with itself on a non-existing field. The non-standard -j 2
may be replaced by -1 2 -2 2
(but not by -j2
unless you use GNU join
).
The awk
command reads the result of this and only outputs results that are pairs that has not yet been seen.
What do you mean by "the file is sorted"? Sorted by which criteria?
– Enno
Mar 17 at 14:36
@Enno Sorted the waysort -b
would sort it.join
require sorted input files.
– Kusalananda
Mar 17 at 14:44
add a comment |
A python
solution.
The input file is fed to itertools.combinations
from the standard library, which generates 2-length tuples that are formatted and printed to standard output.
python3 -c 'from itertools import combinations
with open("file") as f:
lines = (line.rstrip() for line in f)
lines = ("{} {}".format(x, y) for x, y in combinations(lines, 2))
print(*lines, sep="n")
'
add a comment |
If you have ruby
installed:
$ ruby -0777 -F'n' -lane '$F.combination(2) { |c| puts c.join(" ")}' ip.txt
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
-0777
slurp entire file (should be okay as it is mentioned in OP that file size is small)
-F'n'
split based on newline, so each line will be an element in$F
array
$F.combination(2)
generate combinations2
elements at a time
{ |c| puts c.join(" ")}
print as required- if input file can contain duplicates, use
$F.uniq.combination(2)
for 3 elements at a time:
$ ruby -0777 -F'n' -lane '$F.combination(3) { |c| puts c.join(" ")}' ip.txt
a b c
a b d
a b e
a c d
a c e
a d e
b c d
b c e
b d e
c d e
With perl
(not generic)
$ perl -0777 -F'n' -lane 'for $i (0..$#F) {
for $j ($i+1..$#F) {
print "$F[$i] $F[$j]n" } }' ip.txt
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
With awk
$ awk '{ a[NR]=$0 }
END{ for(i=1;i<=NR;i++)
for(j=i+1;j<=NR;j++)
print a[i], a[j] }' ip.txt
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
add a comment |
Here's one in pure shell.
test $# -gt 1 || exit
a=$1
shift
for f in "$@"
do
echo $a $f
done
exec /bin/sh $0 "$@"
Example:
~ (137) $ sh test.sh $(cat file.dat)
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
~ (138) $
1
Command substitution strips trailing newlines, so you're better off with something like<file.dat xargs test.sh
thantest.sh $(cat file.dat)
– iruvar
Mar 17 at 20:33
add a comment |
Using Perl
we can do it as shown:
$ perl -lne '
push @A, $_}{
while ( @A ) {
my $e = shift @A;
print "$e $_" for @A;
}
' input.txt
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "106"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
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%2funix.stackexchange.com%2fquestions%2f506815%2fbash-pair-each-line-of-file%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
6 Answers
6
active
oldest
votes
6 Answers
6
active
oldest
votes
active
oldest
votes
active
oldest
votes
Use this command:
awk '{ name[$1]++ }
END { PROCINFO["sorted_in"] = "@ind_str_asc"
for (v1 in name) for (v2 in name) if (v1 < v2) print v1, v2 }
' files.dat
PROCINFO
may be a gawk
extension.
If your awk
doesn’t support it,
just leave out the PROCINFO["sorted_in"] = "@ind_str_asc"
line
and pipe the output into sort
(if you want the output sorted).
(This does not require the input to be sorted.)
add a comment |
Use this command:
awk '{ name[$1]++ }
END { PROCINFO["sorted_in"] = "@ind_str_asc"
for (v1 in name) for (v2 in name) if (v1 < v2) print v1, v2 }
' files.dat
PROCINFO
may be a gawk
extension.
If your awk
doesn’t support it,
just leave out the PROCINFO["sorted_in"] = "@ind_str_asc"
line
and pipe the output into sort
(if you want the output sorted).
(This does not require the input to be sorted.)
add a comment |
Use this command:
awk '{ name[$1]++ }
END { PROCINFO["sorted_in"] = "@ind_str_asc"
for (v1 in name) for (v2 in name) if (v1 < v2) print v1, v2 }
' files.dat
PROCINFO
may be a gawk
extension.
If your awk
doesn’t support it,
just leave out the PROCINFO["sorted_in"] = "@ind_str_asc"
line
and pipe the output into sort
(if you want the output sorted).
(This does not require the input to be sorted.)
Use this command:
awk '{ name[$1]++ }
END { PROCINFO["sorted_in"] = "@ind_str_asc"
for (v1 in name) for (v2 in name) if (v1 < v2) print v1, v2 }
' files.dat
PROCINFO
may be a gawk
extension.
If your awk
doesn’t support it,
just leave out the PROCINFO["sorted_in"] = "@ind_str_asc"
line
and pipe the output into sort
(if you want the output sorted).
(This does not require the input to be sorted.)
answered Mar 17 at 14:40
G-ManG-Man
13.6k93768
13.6k93768
add a comment |
add a comment |
$ join -j 2 -o 1.1,2.1 file file | awk '!seen[$1,$2]++ && !seen[$2,$1]++'
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
This assumes that no line in the input file contains any whitespace. It also assumes that the file is sorted.
The join
command creates the full cross product of the lines in the file. It does this by joining the file with itself on a non-existing field. The non-standard -j 2
may be replaced by -1 2 -2 2
(but not by -j2
unless you use GNU join
).
The awk
command reads the result of this and only outputs results that are pairs that has not yet been seen.
What do you mean by "the file is sorted"? Sorted by which criteria?
– Enno
Mar 17 at 14:36
@Enno Sorted the waysort -b
would sort it.join
require sorted input files.
– Kusalananda
Mar 17 at 14:44
add a comment |
$ join -j 2 -o 1.1,2.1 file file | awk '!seen[$1,$2]++ && !seen[$2,$1]++'
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
This assumes that no line in the input file contains any whitespace. It also assumes that the file is sorted.
The join
command creates the full cross product of the lines in the file. It does this by joining the file with itself on a non-existing field. The non-standard -j 2
may be replaced by -1 2 -2 2
(but not by -j2
unless you use GNU join
).
The awk
command reads the result of this and only outputs results that are pairs that has not yet been seen.
What do you mean by "the file is sorted"? Sorted by which criteria?
– Enno
Mar 17 at 14:36
@Enno Sorted the waysort -b
would sort it.join
require sorted input files.
– Kusalananda
Mar 17 at 14:44
add a comment |
$ join -j 2 -o 1.1,2.1 file file | awk '!seen[$1,$2]++ && !seen[$2,$1]++'
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
This assumes that no line in the input file contains any whitespace. It also assumes that the file is sorted.
The join
command creates the full cross product of the lines in the file. It does this by joining the file with itself on a non-existing field. The non-standard -j 2
may be replaced by -1 2 -2 2
(but not by -j2
unless you use GNU join
).
The awk
command reads the result of this and only outputs results that are pairs that has not yet been seen.
$ join -j 2 -o 1.1,2.1 file file | awk '!seen[$1,$2]++ && !seen[$2,$1]++'
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
This assumes that no line in the input file contains any whitespace. It also assumes that the file is sorted.
The join
command creates the full cross product of the lines in the file. It does this by joining the file with itself on a non-existing field. The non-standard -j 2
may be replaced by -1 2 -2 2
(but not by -j2
unless you use GNU join
).
The awk
command reads the result of this and only outputs results that are pairs that has not yet been seen.
edited Mar 17 at 14:35
answered Mar 17 at 14:28
KusalanandaKusalananda
137k17258426
137k17258426
What do you mean by "the file is sorted"? Sorted by which criteria?
– Enno
Mar 17 at 14:36
@Enno Sorted the waysort -b
would sort it.join
require sorted input files.
– Kusalananda
Mar 17 at 14:44
add a comment |
What do you mean by "the file is sorted"? Sorted by which criteria?
– Enno
Mar 17 at 14:36
@Enno Sorted the waysort -b
would sort it.join
require sorted input files.
– Kusalananda
Mar 17 at 14:44
What do you mean by "the file is sorted"? Sorted by which criteria?
– Enno
Mar 17 at 14:36
What do you mean by "the file is sorted"? Sorted by which criteria?
– Enno
Mar 17 at 14:36
@Enno Sorted the way
sort -b
would sort it. join
require sorted input files.– Kusalananda
Mar 17 at 14:44
@Enno Sorted the way
sort -b
would sort it. join
require sorted input files.– Kusalananda
Mar 17 at 14:44
add a comment |
A python
solution.
The input file is fed to itertools.combinations
from the standard library, which generates 2-length tuples that are formatted and printed to standard output.
python3 -c 'from itertools import combinations
with open("file") as f:
lines = (line.rstrip() for line in f)
lines = ("{} {}".format(x, y) for x, y in combinations(lines, 2))
print(*lines, sep="n")
'
add a comment |
A python
solution.
The input file is fed to itertools.combinations
from the standard library, which generates 2-length tuples that are formatted and printed to standard output.
python3 -c 'from itertools import combinations
with open("file") as f:
lines = (line.rstrip() for line in f)
lines = ("{} {}".format(x, y) for x, y in combinations(lines, 2))
print(*lines, sep="n")
'
add a comment |
A python
solution.
The input file is fed to itertools.combinations
from the standard library, which generates 2-length tuples that are formatted and printed to standard output.
python3 -c 'from itertools import combinations
with open("file") as f:
lines = (line.rstrip() for line in f)
lines = ("{} {}".format(x, y) for x, y in combinations(lines, 2))
print(*lines, sep="n")
'
A python
solution.
The input file is fed to itertools.combinations
from the standard library, which generates 2-length tuples that are formatted and printed to standard output.
python3 -c 'from itertools import combinations
with open("file") as f:
lines = (line.rstrip() for line in f)
lines = ("{} {}".format(x, y) for x, y in combinations(lines, 2))
print(*lines, sep="n")
'
answered Mar 17 at 15:27
iruvariruvar
12.2k63062
12.2k63062
add a comment |
add a comment |
If you have ruby
installed:
$ ruby -0777 -F'n' -lane '$F.combination(2) { |c| puts c.join(" ")}' ip.txt
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
-0777
slurp entire file (should be okay as it is mentioned in OP that file size is small)
-F'n'
split based on newline, so each line will be an element in$F
array
$F.combination(2)
generate combinations2
elements at a time
{ |c| puts c.join(" ")}
print as required- if input file can contain duplicates, use
$F.uniq.combination(2)
for 3 elements at a time:
$ ruby -0777 -F'n' -lane '$F.combination(3) { |c| puts c.join(" ")}' ip.txt
a b c
a b d
a b e
a c d
a c e
a d e
b c d
b c e
b d e
c d e
With perl
(not generic)
$ perl -0777 -F'n' -lane 'for $i (0..$#F) {
for $j ($i+1..$#F) {
print "$F[$i] $F[$j]n" } }' ip.txt
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
With awk
$ awk '{ a[NR]=$0 }
END{ for(i=1;i<=NR;i++)
for(j=i+1;j<=NR;j++)
print a[i], a[j] }' ip.txt
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
add a comment |
If you have ruby
installed:
$ ruby -0777 -F'n' -lane '$F.combination(2) { |c| puts c.join(" ")}' ip.txt
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
-0777
slurp entire file (should be okay as it is mentioned in OP that file size is small)
-F'n'
split based on newline, so each line will be an element in$F
array
$F.combination(2)
generate combinations2
elements at a time
{ |c| puts c.join(" ")}
print as required- if input file can contain duplicates, use
$F.uniq.combination(2)
for 3 elements at a time:
$ ruby -0777 -F'n' -lane '$F.combination(3) { |c| puts c.join(" ")}' ip.txt
a b c
a b d
a b e
a c d
a c e
a d e
b c d
b c e
b d e
c d e
With perl
(not generic)
$ perl -0777 -F'n' -lane 'for $i (0..$#F) {
for $j ($i+1..$#F) {
print "$F[$i] $F[$j]n" } }' ip.txt
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
With awk
$ awk '{ a[NR]=$0 }
END{ for(i=1;i<=NR;i++)
for(j=i+1;j<=NR;j++)
print a[i], a[j] }' ip.txt
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
add a comment |
If you have ruby
installed:
$ ruby -0777 -F'n' -lane '$F.combination(2) { |c| puts c.join(" ")}' ip.txt
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
-0777
slurp entire file (should be okay as it is mentioned in OP that file size is small)
-F'n'
split based on newline, so each line will be an element in$F
array
$F.combination(2)
generate combinations2
elements at a time
{ |c| puts c.join(" ")}
print as required- if input file can contain duplicates, use
$F.uniq.combination(2)
for 3 elements at a time:
$ ruby -0777 -F'n' -lane '$F.combination(3) { |c| puts c.join(" ")}' ip.txt
a b c
a b d
a b e
a c d
a c e
a d e
b c d
b c e
b d e
c d e
With perl
(not generic)
$ perl -0777 -F'n' -lane 'for $i (0..$#F) {
for $j ($i+1..$#F) {
print "$F[$i] $F[$j]n" } }' ip.txt
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
With awk
$ awk '{ a[NR]=$0 }
END{ for(i=1;i<=NR;i++)
for(j=i+1;j<=NR;j++)
print a[i], a[j] }' ip.txt
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
If you have ruby
installed:
$ ruby -0777 -F'n' -lane '$F.combination(2) { |c| puts c.join(" ")}' ip.txt
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
-0777
slurp entire file (should be okay as it is mentioned in OP that file size is small)
-F'n'
split based on newline, so each line will be an element in$F
array
$F.combination(2)
generate combinations2
elements at a time
{ |c| puts c.join(" ")}
print as required- if input file can contain duplicates, use
$F.uniq.combination(2)
for 3 elements at a time:
$ ruby -0777 -F'n' -lane '$F.combination(3) { |c| puts c.join(" ")}' ip.txt
a b c
a b d
a b e
a c d
a c e
a d e
b c d
b c e
b d e
c d e
With perl
(not generic)
$ perl -0777 -F'n' -lane 'for $i (0..$#F) {
for $j ($i+1..$#F) {
print "$F[$i] $F[$j]n" } }' ip.txt
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
With awk
$ awk '{ a[NR]=$0 }
END{ for(i=1;i<=NR;i++)
for(j=i+1;j<=NR;j++)
print a[i], a[j] }' ip.txt
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
edited Mar 17 at 15:10
answered Mar 17 at 14:43
SundeepSundeep
7,5511927
7,5511927
add a comment |
add a comment |
Here's one in pure shell.
test $# -gt 1 || exit
a=$1
shift
for f in "$@"
do
echo $a $f
done
exec /bin/sh $0 "$@"
Example:
~ (137) $ sh test.sh $(cat file.dat)
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
~ (138) $
1
Command substitution strips trailing newlines, so you're better off with something like<file.dat xargs test.sh
thantest.sh $(cat file.dat)
– iruvar
Mar 17 at 20:33
add a comment |
Here's one in pure shell.
test $# -gt 1 || exit
a=$1
shift
for f in "$@"
do
echo $a $f
done
exec /bin/sh $0 "$@"
Example:
~ (137) $ sh test.sh $(cat file.dat)
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
~ (138) $
1
Command substitution strips trailing newlines, so you're better off with something like<file.dat xargs test.sh
thantest.sh $(cat file.dat)
– iruvar
Mar 17 at 20:33
add a comment |
Here's one in pure shell.
test $# -gt 1 || exit
a=$1
shift
for f in "$@"
do
echo $a $f
done
exec /bin/sh $0 "$@"
Example:
~ (137) $ sh test.sh $(cat file.dat)
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
~ (138) $
Here's one in pure shell.
test $# -gt 1 || exit
a=$1
shift
for f in "$@"
do
echo $a $f
done
exec /bin/sh $0 "$@"
Example:
~ (137) $ sh test.sh $(cat file.dat)
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
~ (138) $
edited Mar 18 at 3:59
answered Mar 17 at 18:05
EdCEdC
512
512
1
Command substitution strips trailing newlines, so you're better off with something like<file.dat xargs test.sh
thantest.sh $(cat file.dat)
– iruvar
Mar 17 at 20:33
add a comment |
1
Command substitution strips trailing newlines, so you're better off with something like<file.dat xargs test.sh
thantest.sh $(cat file.dat)
– iruvar
Mar 17 at 20:33
1
1
Command substitution strips trailing newlines, so you're better off with something like
<file.dat xargs test.sh
than test.sh $(cat file.dat)
– iruvar
Mar 17 at 20:33
Command substitution strips trailing newlines, so you're better off with something like
<file.dat xargs test.sh
than test.sh $(cat file.dat)
– iruvar
Mar 17 at 20:33
add a comment |
Using Perl
we can do it as shown:
$ perl -lne '
push @A, $_}{
while ( @A ) {
my $e = shift @A;
print "$e $_" for @A;
}
' input.txt
add a comment |
Using Perl
we can do it as shown:
$ perl -lne '
push @A, $_}{
while ( @A ) {
my $e = shift @A;
print "$e $_" for @A;
}
' input.txt
add a comment |
Using Perl
we can do it as shown:
$ perl -lne '
push @A, $_}{
while ( @A ) {
my $e = shift @A;
print "$e $_" for @A;
}
' input.txt
Using Perl
we can do it as shown:
$ perl -lne '
push @A, $_}{
while ( @A ) {
my $e = shift @A;
print "$e $_" for @A;
}
' input.txt
answered Mar 18 at 1:28
Rakesh SharmaRakesh Sharma
352115
352115
add a comment |
add a comment |
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
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%2funix.stackexchange.com%2fquestions%2f506815%2fbash-pair-each-line-of-file%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
Does it have to be in bash proper, or just something available via the bash commandline? Other utilities are better positioned to process text.
– Jeff Schaller
Mar 17 at 14:15
@JeffSchaller Something accessible via the bash commandline. I was a bit unclear, sorry
– Enno
Mar 17 at 14:17
This is almost becoming a Code Golf :P
– Richard de Wit
Mar 18 at 11:22
3
As a general rule, as long as you need to do something non-trivial, use your favourite scripting language over BASH. It will be less fragile (for example, against special characters or spaces), and much easier to expand whenever you need it (if you need three, or filter some of them away). Python or Perl should be installed in almost any Linux box, so they are good choices (unless you are working on embedded systems, like Busybox).
– Davidmh
Mar 18 at 12:26