2015-04-24 2 views
0

Привет, У меня есть одна команда AWK, которая объединяет два файла с одним и тем же ключом.Объединение (слияние) Несколько строк с использованием AWK

awk -v OFS='\t' ' 
NR==1 { print $0, "Column4", "Column5"; next } 
NR==FNR { a[$1]=$0; next} 
$1 in a { print a[$1], $2, $3 } 
' $1 $2 > $3 

Это возвращает только один ключ из каждого файла. Например, как показано ниже,

Файл 1

Key Column1 Column2 Column3 
Test1 500  400  200    
Test1 499  400  200    
Test1 499  399  200    
Test1 498  100  100    
Test2 600  200  150    
Test2 600  199  150    
Test2 599  199  100    

Файл 2

Test1 Good  Good      
Test2 Good  Good 

Тогда результаты будут

Key Column1 Column2 Column3 Column4 Column5 
Test1 500  400  200  Good  Good 
Test2 600  200  150  Good  Good 

, но я хочу, чтобы все строки объединены, как показано ниже ,

Key Column1 Column2 Column3 Column4 Column5 
Test1 500  400  200  Good  Good    
Test1 499  400  200  Good  Good    
Test1 499  399  200  Good  Good    
Test1 498  100  100  Good  Good    
Test2 600  200  150  Good  Good    
Test2 600  199  150  Good  Good    
Test2 599  199  100  Good  Good   

У любого есть идея просто изменить логику с помощью AWK. Спасибо! С

+1

Я думаю, что вам не хватает '; next' в этом блоке 'NR == FNR'. –

+0

@ EtanReisner Да, я изменил спасибо! –

ответ

2

Я думаю, что вы ищете

join file1 file2 

Если вы настаиваете делать это с AWK, хороший способ будет обрабатывать файлы наоборот, так что у вас есть части, которые вы хотите добавить готовы при обработке основного файла:

awk -v OFS='\t' ' 
    FNR == NR { a[$1] = $2 OFS $3; next } 
    { $1 = $1 } 
    FNR == 1 { print $0, "Column4", "Column5" } 
    FNR != 1 { print $0, a[$1] } 
    ' "$2" "$1" > "$3" 

EDIT: @EtanReisner предложил добавление { $1 = $1 }. Цель этого - заставить awk перестроить линию из полей, так что входные данные, разделенные смесью пробелов, выходят равномерно, разделенные OFS (вкладка в этом случае). Если данные уже разделены табуляцией, это необязательно (но не больно).

+0

Спасибо! но если я использую join head, будут удалены и вы захотите узнать, используя awk –

+0

Извините, у второго файла нет заголовка, –

+0

@ clear.choi Это вытаскивает заголовок из второго файла не первым. Замечание 'FNR == 1' является * после * блока' FNR == NR'. –

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