2017-02-10 18 views
0

Файл 1:N комбинаций слов, просто Баш

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

и т.д.

+0

каков ваш желаемый результат? Я не понимаю запросы № 2 и № 3. Я предлагаю сделать небольшой, но полный пример – NinjaGaiden

+0

У меня есть упрощенный текст, слишком длинный текст путают людей – Jonh

ответ

0

Если файлы могут быть отсортированы (и исключить повторяющиеся строки), это может работать:

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

Он использует расширение Баш для создания комбинации, например:

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

Кроме того, вы должны БЕСПЛАТНО доверять содержимому файлов, потому что код использует опасные eval.

Аргумент head как head -2 может быть использован для ограничения cound линий от 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