2015-09-17 1 views
3

Есть ли короткий путь в bash, чтобы повторить первую строку файла так часто, как нужно, чтобы вставить его другим файлом в тип продукта kronecker (для вас математиков)? Что я имею в виду, у меня есть файл A:Как повторять строки в bash и вставить с разными столбцами?

a 
    b 
    c 

и файл B:

x 
    y 
    z 

, и я хочу, чтобы объединить их следующим образом:

a x 
    a y 
    a z 
    b x 
    b y 
    b z 
    c x 
    c y 
    c z 

я мог бы, вероятно, написать сценарий, прочитать файлы по строкам и петлю над ними, но мне интересно, есть ли короткая однострочная команда, которая могла бы выполнять ту же работу. Я не могу думать об одном, и, как вы можете видеть, мне также не хватает некоторых ключевых слов для поиска. :-D

Заранее спасибо.

ответ

5

Вы можете использовать один-лайнер команды AWK:

awk 'FNR==NR{a[++n]=$0; next} {for(i=1; i<=n; i++) print $0, a[i]}' file2 file1 
a x 
a y 
a z 
b x 
b y 
b z 
c x 
c y 
c z 

Распад:

NR == FNR {     # While processing the first file in the list 
    a[++n]=$0     # store the row in array 'a' by the an incrementing index 
    next      # move to next record 
} 
{       # while processing the second file 
    for(i=1; i<=n; i++)  # iterate over the array a 
    print $0, a[i]    # print current row and array element 
} 
+1

Wow, я знал, awk отлично. Мне действительно нужно немного узнать о том, как его использовать. Спасибо, это работает. – quarky

+1

Я добавил некоторое объяснение используемой команды awk. – anubhava

0

альтернативу AWK

join <(sed 's/^/_\t/' file1) <(sed 's/^/_\t/' file2) | cut -d' ' -f2- 

добавить поддельный ключ для join иметь все записи файла1 соответствуют всем записям файла2, terwards