2014-08-10 2 views
0

У меня есть 2 файлов, о которых я в настоящее время манипулируют каждый из них в AWK:Баш - слияния и манипулирования 2 файлов

===================== == Файл 1: ===================

0x0002 RUNNING EXISTS foo 253 65535 
0x0003 RUNNING EXISTS foo 252 5 
0x0004 RUNNING EXISTS foo 251 3 

Я заинтересован в первом поле и последняя 2.

поле 1 : vdisk (в шестнадцатеричном формате). Последние два поля являются возможными Cdisks для каждого vdisk. По крайней мере, 1 должен существовать. значения десятичные. Если появляется число «65535», это означает, что 2-й cdisk не существует.

Я использую эту AWK для отображения удобного стола:

awk 'BEGIN {print "vdisk cdisk Mr_cdisk"} 
{ 
     if ($3 ~ /EXISTS|THIS_AGENT_ONLINE/) { 
      sub("65535", "N/A") 
      printf "%-11s %-6s %s\n",$1,$(NF-1),$(NF) 
     } 
    }' ${FILE} 

будет производить эту таблицу:

vdisk cdisk Mr_cdisk 
0x0002 253 N/A 
0x0003 252 5 
0x0004 1  3 

================ ======= Файл 2: ===================

0x0000 Cmp cli Foo 0 SOME 0 0x0 0x0 0x0 
0x0001 Cmp own Foo 1 NONE 0 0x0 0x0 0x0 
0x0002 Cmp cli Foo 0 SOME 0 0x0 0x1 0x0 
0x0003 Cmp own Foo 0 NONE 0 0x0 0x0 0x1 
0x0004 Cmp cli Foo 0 SOME 0 0x0 0x0 0x0 
0x0005 Cmp own Foo 1 NONE 0 0x1 0x0 0x0 

Я заинтересован в "КСС собственные" линии, в которой первым полем является Cdisk (в шестнадцатеричном формате). Пятое поле с конца (непосредственно перед текстом SOME/NONE) - это номер экземпляра. Это либо 0, либо 1. Я использую эту AWK для отображения удобного стола:

awk 'BEGIN {print "cdisk(hex) RACE_Instance"} 
        /Cmp own/ { 
         printf "%-11s %-10s\n",$1,$(NF-5) 
        }' ${FILE}; 

Это будет производить в следующей таблице:

cdisk(hex) Instance 
0x0001  1 
0x0003  0 
0x0005  1 

+++++++++++ +++++++++++++++++++++

Что бы я хотел показывать объединенную таблицу. Предпочтительно, непосредственно из исходных файлов. Он должен распространять первые данные на 2 строки (если их больше 1 cdisk). Это будет основой для слияния. Затем напечатайте номер экземпляра, если он существует в этом cdisk.

vdisk(hex) cdisk(hex) Instance 
0x0002  0x00fd  N/A 
0x0003  0x00fc  N/A 
0x0003  0x0005  1 
0x0004  0x0001  0 
0x0004  0x0003  1 

Я бы предпочел решение с awk. :)

Спасибо!

EDIT: добавлена ​​дополнительная информация и исправлена ​​одна таблица данных.

EDIT2: Упрощенный ввод

+0

Итак, какие вы пытаетесь слиться? Вам все еще нужны отдельные таблицы, или вы ищете способ перейти непосредственно от входных файлов к окончательному результату? –

+0

Я бы предпочел получить конечный результат напрямую. Мне нужно объединить поле cdisk. Каждый «vdisk» может иметь максимум 2 «cdisk». Либо поле cdisk или/и "Mr_cdisk". –

+2

Я думаю, что с небольшим усилием вы могли бы облегчить нам задачу, чтобы понять и помочь нам помочь вам.Избавьтесь от -non-decimal флага данных и уменьшите ваш входной вывод образца до 3 или 4 строк из 3 или 4 разделенных пробелами полей, которые представляют вашу текущую проблему. –

ответ

0

Я не мог понять, что это отображение из ваших 2 входных файлов на свой выход, но это должно направить вас в правильном направлении:

$ cat tst.awk 
NR==FNR { 
    v2c[$1] = sprintf("0x%04x",$5) 
    v2m[$1] = ($6==65535 ? "N/A" : sprintf("0x%04x",$6)) 
    next 
} 

$1 in v2c { 
    print $1, v2c[$1], $5 
    print $1, v2m[$1], $5 
} 
$ 
$ awk -f tst.awk file1 file2 
0x0002 0x00fd 0 
0x0002 N/A 0 
0x0003 0x00fc 0 
0x0003 0x0005 0 
0x0004 0x00fb 0 
0x0004 0x0003 0 
+0

Спасибо, пожалуйста, уточните код? –

+0

Я не уверен, о чем нужно подумать, он просто заполняет пару ассоциативных массивов при чтении 1-го файла, а затем печатает их вместе с полями из второго файла при чтении второго файла. Есть ли что-нибудь, в частности, вы не понимаете? –

+0

Ну, я не знал об использовании массива в awk. Как каждый файл разделяется на каждый массив? Кроме того, результат немного отличается от моего примера и ожидаемой таблицы. vdisk 0x2 связан только с cdisk 0xfd (второй - N/A), поэтому в результате должна получиться только одна строка. Для vdisk 0x3, cdisk 0x5 и vdisk 0x4 cdisk 0x3 оба должны иметь экземпляр 1. Также, vdisk 0x2, cdisk 0xfd не должен иметь 0 в качестве экземпляра. Должно быть N/A. Прошу прощения, если у меня возникнут проблемы с тем, чтобы точно определить, что мне нужно. Ваша помощь приветствуется. –

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