N个单词组合,简单的bash

时间:2017-02-10 12:10:57

标签: bash text combinations text-processing

文件1:

1F
2F
3F
4F
5f

文件2:

1F
2F
3F
4F
5f

我有一个简单的代码,可以产生所有可能的组合

#!/bin/bash
    for a in $(awk '{print $1}' intf1) 
    do 
        for b in $(awk '{print $1}' intf2) 
        do 
            echo -e "$a:$b" >> file
        done 
    done

此代码的输出:

1F:1F
1F:2F
1F:3F
1F:4F
2F:1F
etc

但我想:

1)完全避免重复

2)"选择号码" (他将从第二个文件中获取的单词(行)数量):

第二个文件中的每两行:

1F:2F
1F:3F
2F:3F
2F:4F
3F:4F
3F:5F
4F:5F

第二个文件中的每三行:

 1F:2F
 1F:3F
 1F:4F
 2F:3F
 2F:4F
 2F:5F
etc..

等等

1 个答案:

答案 0 :(得分:0)

如果文件可以排序(并排除重复行),这可能有效:

printf "%s\n" $(eval "echo {$(sort -u file.txt | paste -sd, -)}:{$(sort -u file2.txt | head -2 | paste -sd, -)}") | sort -u

它使用bash扩展来生成组合,例如:

$ echo {a,b}{X,Y,Z}
aX aY aZ bX bY bZ

另外,您必须绝对信任文件的内容,因为代码使用了危险的eval

head之类的head -2的参数可用于限制来自file2.txt

的线条的数量

代码生成(通过将第二个文件限制为2个已排序的行)以下内容:

20160702F:20160702F
20160702F:20160714F
20160714F:20160702F
20160714F:20160714F
20160807F:20160702F
20160807F:20160714F
20160819F:20160702F
20160819F:20160714F
20160831F:20160702F
20160831F:20160714F
20160912F:20160702F
20160912F:20160714F