2012-08-31 3 views
2

Вот моя проблемаКак использовать команду Баша в AWK

У меня есть файл 1, где у меня есть некоторые данные

Var1.1 Var1.2 Var1.3 
Var2.1 Var2.2 Var2.3 
Var3.1 Var3.2 Var3.3 

И у меня есть файл 2, который я хотел редактировать благодаря Приведенные выше данные

Файл2 (1)

***pattern with Var2.1*** 
some text... 

Файл2 (2)

***pattern with Var2.1*** 
Here I want to add Var2.2 and Var2.3 
some text 

Моего первое решения использовать AWK, но я не знаю, чтобы включить команду Баша в AWK должна сделать что-то вроде:.

  • Поиска шаблона в Файл2
  • Когда awk get, awk вызывает скрипт, который возвращает нужные значения из File1.
  • Затем AWK может редактировать File2

, не стесняйтесь, чтобы объяснить мне другие возможности, если есть, которые более просты!

Спасибо!

+0

Непонятно, что вы хотите, вам нужно предоставить явные примеры ввода и ожидаемого вывода. – Thor

+0

Что вам нужно больше, чем я уже дал? – n0n0bstan

+0

Я не думаю, что «imbricate» означает то, что вы думаете, что это значит. Я бы использовал «включить» или «включить». –

ответ

1

Там нет необходимости запускать внешний скрипт, чтобы выполнить то, что вы хотите. Это можно сделать полностью в коротком AWK-скрипте.

awk 'FNR == NR {arr[$1] = $2 " " $3; next} {print; for (lookup in arr) {if ($0 ~ lookup) {split(arr[lookup], a); print "Here I want to add " a[1] " and " a[2]}}}' File1 File2 

Объяснение:

  • FNR == NR {arr[$1] = $2 " " $3; next} - Loop через первый файл и сохранить все значения в массиве индексируется в первом столбце. Номер записи равен номеру записи файла для первого файла.
  • print - Печать каждой строки ввода.
  • for (lookup in arr) {if ($0 ~ lookup) { - Прокрутите каждый из индексов массива и проверьте соответствие строки ввода.
  • split(arr[lookup], a) - Разделить значение, сохраненное в совпадающем индексе, во временный массив.
  • print "Here I want to add " a[1] " and " a[2] - Распечатайте некоторый текст, используя два значения, полученные в результате разделения.
+0

Я пробую этот метод, и я говорю вам, но, похоже, это то, что я ищу! Спасибо ! – n0n0bstan

+0

Пожалуйста, ответьте на вопрос: «Как использовать команду bash внутри awk» –

+1

@ NoémienKocher: AWK имеет функцию 'system()', поэтому вы можете сделать в качестве примера 'awk 'BEGIN {system (" echo $ BASH_VERSION «)}'.Вы также можете отправить команду Bash через канал: 'awk 'BEGIN {print" echo $ BASH_VERSION "| "/ Бен/Баш"; close ("/ bin/bash")} ''. Вы также можете использовать 'getline' для захвата вывода команды:' awk 'BEGIN {cmd = "echo $ BASH_VERSION"; while ((cmd | результат getline)> 0) {результат печати}; закрыть (CMD)} ' '. –

5

Это, как я запустить внешнюю команду в AWK в base64-декодирование строки:

cmd = "/usr/bin/base64 -i -d <<< " $2 " 2>/dev/null" 
while ((cmd | getline result) > 0) { } 
close(cmd) 
split(result, a, "[:=,]") 
name=a[2] 

Может быть, вы можете получить вдохновение от него ...

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