Bash - pair each line of file2019 Community Moderator ElectionCommand line tool to “cat” pairwise expansion of all rows in a fileCost-efficiently pair each line of a file with all othersHow to rewrite multiline path into one-line relative pathMerge two files line by line with the delimiter triple pipe symbol “|||”How do I remove all but the file name (with no extension) from a full file path?Insert string or line after last instance of a specific search variable, in a loopcopy every line from a text file that contains a number greater than 5000How to insert a line from file A above the FIRST LINE in file Bextract lines from a file based on sequential pair of patterns, and output to separate filesscript to parse file for two consecutive lines of unequal lengthHow to add a path before the first character of each line in a file.txt and save the same file with those edits?How can I add 10 lines from a file (file2) to another one after 2 lines (file1)?

What should I install to correct "ld: cannot find -lgbm and -linput" so that I can compile a Rust program?

What are substitutions for coconut in curry?

Is it true that good novels will automatically sell themselves on Amazon (and so on) and there is no need for one to waste time promoting?

How do hiring committees for research positions view getting "scooped"?

Bash - pair each line of file

Is it insecure to send a password in a `curl` command?

What is the significance behind "40 days" that often appears in the Bible?

What does Deadpool mean by "left the house in that shirt"?

World War I as a war of liberals against authoritarians?

If "dar" means "to give", what does "daros" mean?

Print a physical multiplication table

Calculate the frequency of characters in a string

Why is indicated airspeed rather than ground speed used during the takeoff roll?

Have the tides ever turned twice on any open problem?

Is there a term for accumulated dirt on the outside of your hands and feet?

Worshiping one God at a time?

Fewest number of steps to reach 200 using special calculator

Variable completely messes up echoed string

Is there a hypothetical scenario that would make Earth uninhabitable for humans, but not for (the majority of) other animals?

How to terminate ping <dest> &

How does 取材で訪れた integrate into this sentence?

HP P840 HDD RAID 5 many strange drive failures

In Aliens, how many people were on LV-426 before the Marines arrived​?

Why didn't Héctor fade away after this character died in the movie Coco?



Bash - pair each line of file



2019 Community Moderator ElectionCommand line tool to “cat” pairwise expansion of all rows in a fileCost-efficiently pair each line of a file with all othersHow to rewrite multiline path into one-line relative pathMerge two files line by line with the delimiter triple pipe symbol “|||”How do I remove all but the file name (with no extension) from a full file path?Insert string or line after last instance of a specific search variable, in a loopcopy every line from a text file that contains a number greater than 5000How to insert a line from file A above the FIRST LINE in file Bextract lines from a file based on sequential pair of patterns, and output to separate filesscript to parse file for two consecutive lines of unequal lengthHow to add a path before the first character of each line in a file.txt and save the same file with those edits?How can I add 10 lines from a file (file2) to another one after 2 lines (file1)?










9















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.










share|improve this question









New contributor




Enno is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.




















  • 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
    12 hours ago











  • @JeffSchaller Something accessible via the bash commandline. I was a bit unclear, sorry

    – Enno
    12 hours ago
















9















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.










share|improve this question









New contributor




Enno is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.




















  • 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
    12 hours ago











  • @JeffSchaller Something accessible via the bash commandline. I was a bit unclear, sorry

    – Enno
    12 hours ago














9












9








9








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.










share|improve this question









New contributor




Enno is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.












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






share|improve this question









New contributor




Enno is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











share|improve this question









New contributor




Enno is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









share|improve this question




share|improve this question








edited 12 hours ago









Jeff Schaller

43.4k1160140




43.4k1160140






New contributor




Enno is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked 12 hours ago









EnnoEnno

1483




1483




New contributor




Enno is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





Enno is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






Enno is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.












  • 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
    12 hours ago











  • @JeffSchaller Something accessible via the bash commandline. I was a bit unclear, sorry

    – Enno
    12 hours ago


















  • 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
    12 hours ago











  • @JeffSchaller Something accessible via the bash commandline. I was a bit unclear, sorry

    – Enno
    12 hours ago

















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
12 hours ago





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
12 hours ago













@JeffSchaller Something accessible via the bash commandline. I was a bit unclear, sorry

– Enno
12 hours ago






@JeffSchaller Something accessible via the bash commandline. I was a bit unclear, sorry

– Enno
12 hours ago











6 Answers
6






active

oldest

votes


















6














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.)






share|improve this answer






























    5














    $ 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.






    share|improve this answer

























    • What do you mean by "the file is sorted"? Sorted by which criteria?

      – Enno
      12 hours ago











    • @Enno Sorted the way sort -b would sort it. join require sorted input files.

      – Kusalananda
      12 hours ago



















    5














    If you have ruby installed:



    $ ruby -0777 -F'n' -lane '$F.combination(2) c' 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 combinations 2 elements at a time


    • c 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' 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





    share|improve this answer
































      5














      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")
      '





      share|improve this answer






























        1














        Here's one in pure shell.



        a=$1
        shift
        for f in "$@"
        do
        echo $a $f
        done
        test $# -gt 1 && /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) $





        share|improve this answer










        New contributor




        EdC is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
        Check out our Code of Conduct.




















        • 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
          6 hours ago


















        0














        Using Perl we can do it as shown:



        $ perl -lne '
        push @A, $_}
        while ( @A )
        my $e = shift @A;
        print "$e $_" for @A;

        ' input.txt





        share 











        0














        Using Perl we can do it as shown:



        $ perl -lne '
        push @A, $_
        while ( @A )
        my $e = shift @A;
        print "$e $_" for @A;

        ' input.txt





        share
        while ( @A )
        my $e = shift @A;
        print "$e $_" for @A;

        ' input.txt





        share{
        while ( @A )
        my $e = shift @A;
        print "$e $_" for @A;

        ' input.txt






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered 1 hour ago









        Rakesh SharmaRakesh Sharma

        342115




        342115




















            Enno is a new contributor. Be nice, and check out our Code of Conduct.









            draft saved

            draft discarded


















            Enno is a new contributor. Be nice, and check out our Code of Conduct.












            Enno is a new contributor. Be nice, and check out our Code of Conduct.











            Enno is a new contributor. Be nice, and check out our Code of Conduct.














            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.




            draft saved


            draft discarded














            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





















































            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







            Popular posts from this blog

            How to create a command for the “strange m” symbol in latex? Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern)How do you make your own symbol when Detexify fails?Writing bold small caps with mathpazo packageplus-minus symbol with parenthesis around the minus signGreek character in Beamer document titleHow to create dashed right arrow over symbol?Currency symbol: Turkish LiraDouble prec as a single symbol?Plus Sign Too Big; How to Call adfbullet?Is there a TeX macro for three-legged pi?How do I get my integral-like symbol to align like the integral?How to selectively substitute a letter with another symbol representing the same letterHow do I generate a less than symbol and vertical bar that are the same height?

            Българска екзархия Съдържание История | Български екзарси | Вижте също | Външни препратки | Литература | Бележки | НавигацияУстав за управлението на българската екзархия. Цариград, 1870Слово на Ловешкия митрополит Иларион при откриването на Българския народен събор в Цариград на 23. II. 1870 г.Българската правда и гръцката кривда. От С. М. (= Софийски Мелетий). Цариград, 1872Предстоятели на Българската екзархияПодмененият ВеликденИнформационна агенция „Фокус“Димитър Ризов. Българите в техните исторически, етнографически и политически граници (Атлас съдържащ 40 карти). Berlin, Königliche Hoflithographie, Hof-Buch- und -Steindruckerei Wilhelm Greve, 1917Report of the International Commission to Inquire into the Causes and Conduct of the Balkan Wars

            Чепеларе Съдържание География | История | Население | Спортни и природни забележителности | Културни и исторически обекти | Религии | Обществени институции | Известни личности | Редовни събития | Галерия | Източници | Литература | Външни препратки | Навигация41°43′23.99″ с. ш. 24°41′09.99″ и. д. / 41.723333° с. ш. 24.686111° и. д.*ЧепелареЧепеларски Linux fest 2002Начало на Зимен сезон 2005/06Национални хайдушки празници „Капитан Петко Войвода“Град ЧепелареЧепеларе – народният ски курортbgrod.orgwww.terranatura.hit.bgСправка за населението на гр. Исперих, общ. Исперих, обл. РазградМузей на родопския карстМузей на спорта и скитеЧепеларебългарскибългарскианглийскитукИстория на градаСки писти в ЧепелареВремето в ЧепелареРадио и телевизия в ЧепелареЧепеларе мами с родопски чар и добри пистиЕвтин туризъм и снежни атракции в ЧепелареМестоположениеИнформация и снимки от музея на родопския карст3D панорами от ЧепелареЧепелареррр