2015-12-02 3 views
0

Я много искал свою проблему и тестировал различные решения, но ни один из них не работает. Я даже использовал ту же команду заранее с успехом, но теперь мне не удается получить желаемый результат.awk - если значения совпадают, тогда распечатайте файл1 и файл 2

У меня есть file1

AAA;123456789A 
BBB;123456789B 
CCC;123456789C 

И file2

1;2;3;CCC;pippo 
1;2;3;AAA;pippo 
1;2;3;BBB;pippo 
1;2;3;*;pippo 

Мой желаемый результат заключается в следующем:

1;2;3;CCC;pippo;CCC;123456789C 
1;2;3;AAA;pippo;AAA;123456789A 
1;2;3;BBB;pippo;BBB;123456789B 

Я попытался с помощью этой команды:

awk -F";" -v OFS=";" 'FNR == NR {a[$10]=$1; b[$20]=$2; next}($10 in a){ if(match(a[$10],$4)) print $0,a[$10],b[$20]}' file1 file2 

Но я получаю этот выход (только один ввод, даже с большими файлами):

1;2;3;CCC;pippo;CCC;123456789C 

Что я делаю неправильно? Если он управляет одним, он должен для всех остальных. Почему этого не происходит? Также почему, если я установил a[$1]=$1, он не работает?
Благодарим вас за помощь! Если возможно, вы могли бы объяснить ответ? Поэтому в следующий раз мне не придется просить о помощи!

EDIT: Извините, я не упомянул (так как хотел сохранить пример минимальным), что в файле2 некоторые поля просто «*». И я хотел бы добавить, что «else не соответствует чему-то».

+1

Так что вы хотите, чтобы соответствовать 1-е поле в file1 с 4-го поля в file2? Кроме того, почему вы выбираете поля '$ 10' и' $ 20', если их всего 5 или 6? – fedorqui

+0

'arr' не определен. –

+0

@CasimiretHippolyte это опечатка, 'arr' должно быть' a'. @fedorqui Я просто использовал для значений больше 4. Но почему я не могу использовать $ 1 и $ 2 моего массива 'a'? Разве это не пусто? –

ответ

1

awk на помощь!

$ awk 'BEGIN{FS=OFS=";"} 
    NR==FNR{a[$1]=$0;next} 
      {print $0,a[$4]}' file1 file2 

1;2;3;CCC;pippo;CCC;123456789C 
1;2;3;AAA;pippo;AAA;123456789A 
1;2;3;BBB;pippo;BBB;123456789B 

UPDATE: на основе исходного входного файла он смотрел только для точного соответствия. Если вы хотите, чтобы пропустить записи там, где нет совпадения, вам необходимо квалифицировать блок печати с $4 in a

$ awk 'BEGIN{FS=OFS=";"} 
    NR==FNR{a[$1]=$0;next} 
    $4 in a{print $0,a[$4]}' file1 file2 
+0

Кажется, отлично работает! Большое спасибо! не могли бы вы сказать мне, почему вам не нужно использовать 'if (match())'? –

+0

входной файл изменен после ответа. – karakfa

0

join сделано для этого sort вещи:

$ join -t';' -1 4 -o1.{1..5} -o2.{1..2} <(sort -t';' -k4 file2) <(sort -t';' file1) 

1;2;3;AAA;pippo;AAA;123456789A 
1;2;3;BBB;pippo;BBB;123456789B 
1;2;3;CCC;pippo;CCC;123456789C 

Выход, что вы просили для упорядочения строк, которые я предполагаю, это не имеет значения, за исключением. Параметры -o для join необходимы, потому что вы хотите полный набор полей; вы можете попробовать опустить его, и вместо этого вы получите поле объединения слева, что также может быть прекрасным.

+0

Ницца! К сожалению, работает отлично на примере, но не в моем реальном файле, как я упоминаю в EDIT.Извините, я забыл объяснить кусок. –

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