2013-08-27 2 views
1

Я готовлю экстракт клиента из нашего СНГ, и мне нужна часть данных, которая хранится в ключевом формате в другом файле.Unix shell file search for value pair

Например:

Файл 1 (Extract):

1, 3000, 4000, PVXZT1000, 123-3455 
2, 4000, 2500, BT21304, 123-3455 

Файл 2 (ключ, значение):

PVXZT1000, 136-8400 
BT21304, 136-8400 

Что мне нужно сделать, это посмотреть вверх значение PVXZT1000 в файле 2 и найдите связанное с ним значение. то мне нужно, чтобы заменить значение 123-3455 в файле 1 с новым значением, найденным в файле 2, 136-8400

Есть простой & эффективный способ сделать это с помощью оболочки Unix? Или, возможно, AWK?

Я могу использовать любую из распространенных оболочек unix.

+1

если ключ не найден в файле2, что бы вы сделали с файлом 1? очистить значение «123-3455» или сохранить значение нетронутым? но независимо от того, какое правило оно должно следовать, вы можете найти ответ от двух экспертов awk. – Kent

ответ

3

Один из способов использования awk

$ awk 'NR==FNR{a[$1]=$2;next}($4 in a){$5=a[$4]}1' file2 file1 
1, 3000, 4000, PVXZT1000, 136-8400 
2, 4000, 2500, BT21304, 136-8400 

Это обновит file1 с последним значением в file2 путем сопоставления ключей через файлы.

Пояснение:

NR является awk переменная, которая содержит номер текущей строки считываются. FNR содержит текущую строку в контексте текущего файла i.e каждый раз, когда мы читаем новый файл FNR сбрасывается до 0, но NR нет.

  # Looking at file2 first 
NR==FNR # This is only true when we look at the first file 
{   # The block to execute if the previous condition is TRUE 
a[$1]=$2 # Create a look-up array a: field 1 is the key and field 2 the value 
next  # Grab the next line (skips executing any further blocks) 
}   # End block 
      # We are now looking a file1 
($4 in a) # Check in field 4 was in file2 
$5=a[$4] # If found update field 5 with value in the array using the key 
}   # End the block 
1   # Idiom for printing all the lines 

Если вы хотите узнать awk прочитать Effective AWK Programming.

+0

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

+0

Объяснение приносит пользу всем, поэтому я добавил его к моему ответу. Если вы хотите очистить значение, вы должны сбросить флажок '($ 4 in a)' i.e., что ответ @ user000001, поэтому я добавил примечание, чтобы прояснить разницу. –

+0

Я получаю «awk: синтаксическая ошибка рядом с первой строкой 1» и «awk: спасение около линии 1». Я использую синтаксис, который вы оба предоставили. Есть ли способ проверить, использую ли я более старую версию awk? – TyC

1

Вы можете сделать это с AWK:

awk 'NR==FNR{a[$1]=$2;next}{$5=a[$4]}1' file2 file1 
+0

Примечание: предполагается, что каждое значение в файле1 будет обновлено с допустимым значением, найденным в файле2. –

+1

@sudo_O Да, вы правы. Ваш ответ, вероятно, более надежный. – user000001