2015-06-07 6 views
1

У меня есть файл с разделителем «@». Он имеет повторяющиеся данные, которые можно использовать для разделения файла в разделах. В другом файле у меня есть данные, которые я хотел бы добавить в качестве первого столбца в первый файл. Источник добавленных данных будет зацикливаться с каждым экземпляром повторяющихся данных из первого файла. Файлы выглядят следующим образом:AWK: добавление нового поля из другого файла

Файл 1

[email protected]@6 
[email protected]@7 
[email protected]@7 
[email protected]@7 
[email protected]@8 
[email protected]@9 
[email protected]@10 
[email protected]@12 
[email protected]@10 
[email protected]@10 
[email protected]@10 
[email protected]@10 
[email protected]/[email protected] 
[email protected]@9 
[email protected]@8 
[email protected]/[email protected] 
[email protected]@8 
[email protected]/[email protected] 
[email protected]/[email protected] 
[email protected]/[email protected] 
[email protected]@9 
[email protected]/[email protected] 
[email protected]/[email protected] 
[email protected]@10 
[email protected]/[email protected] 
[email protected]@12 

Другой файл выглядит следующим образом:

Файл 2

London 
New York 
Dallas 

Желаемые результаты выглядят так:

[email protected]@[email protected] 
[email protected]@[email protected] 
[email protected]@[email protected] 
[email protected]@[email protected] 
[email protected]@[email protected] 
[email protected]@[email protected] 
[email protected]@[email protected] 
[email protected]@[email protected] 
[email protected]@[email protected] York 
[email protected]@[email protected] York 
[email protected]@[email protected] York 
[email protected]@[email protected] York 
[email protected]/[email protected]@New York 
[email protected]@[email protected] York 
[email protected]@[email protected] York 
[email protected]/[email protected]@New York 
[email protected]@[email protected] York 
[email protected]/[email protected]@New York 
[email protected]/[email protected]@Dallas 
[email protected]/[email protected]@Dallas 
[email protected]@[email protected] 
[email protected]/[email protected]@Dallas 
[email protected]/[email protected]@Dallas 
[email protected]@[email protected] 
[email protected]/[email protected]@Dallas 
[email protected]@[email protected] 

Я знаю что awk можно использовать для разделения места гонки на «Race1». Я думаю, он начинает что-то вроде:

awk '/Race1/{x="Race"++i;}{print $5= something relating to file 2} 

Кто-нибудь знает, как анализировать, используя AWK, или любой другой команды Linux, для двух файлов с помощью петель и условий?

+0

Действительно ли строки «Файл 1» и «Файл 2» находятся в файлах? – bkmoney

+0

Нет строк «Файл 1» и «Файл 2» на самом деле не находятся в файлах. –

+0

Хорошо, тогда я изменил свой ответ. – bkmoney

ответ

1

Если вы сохраните это как a.awk

BEGIN { 
    FS = OFS = "@" 
    i = 0 
    j = -1 
} 
NR == FNR { 
    a[i++] = $1   
} 
NR != FNR { 
    if ($1 == "Race1") 
     j++   
    $4 = a[j] 
    print  
} 

и запустить

awk -f a.awk file2 file1 

вы получите желаемые результаты.

Выход

[email protected]@[email protected] 
[email protected]@[email protected] 
[email protected]@[email protected] 
[email protected]@[email protected] 
[email protected]@[email protected] 
[email protected]@[email protected] 
[email protected]@[email protected] 
[email protected]@[email protected] 
[email protected]@[email protected] York 
[email protected]@[email protected] York 
[email protected]@[email protected] York 
[email protected]@[email protected] York 
[email protected]/[email protected]@New York 
[email protected]@[email protected] York 
[email protected]@[email protected] York 
[email protected]/[email protected]@New York 
[email protected]@[email protected] York 
[email protected]/2M[email protected]@New York 
[email protected]/[email protected]@Dallas 
[email protected]/[email protected]@Dallas 
[email protected]@[email protected] 
[email protected]/[email protected]@Dallas 
[email protected]/[email protected]@Dallas 
[email protected]@[email protected] 
[email protected]/[email protected]@Dallas 
[email protected]@[email protected] 

Объяснение

Начнем с настройки полей ввода и вывода разделители @. Мы также инициализируем наши переменные i, j, которые будут использоваться в качестве индексов массива.

Первое условие проверяет, проходим ли мы через файл2 с NR == FNR. Во время первого блока мы связываем индекс i с первым полем, которое является названием города. Затем мы увеличиваем i.

Второе условие проверяет, проходим ли мы через файл2 с NR != FNR. Если первое поле равно Race1, то мы увеличиваем j (обратите внимание, что мы инициализировали j равным -1). Мы устанавливаем 4-е поле a[j], а затем печатаем линию.

+0

Спасибо bkmoney. Твоя шиззнит! –

Смежные вопросы