передача двух переменных потоков в качестве входных данных в awk в скрипте

Это была моя исходная командная строка:

awk 'FNR==NR{a[$2]=$1;next}($2 in a){if(a[$2]!=$1)print $2}' file1 file2 

Это находится внутри сценария bash, и я изначально выводил каждый раздел в файл, а затем на следующей строке я использовал этот файл в качестве входного. Однако теперь я перехожу к использованию переменных, и я дошел до этой строки и застрял из-за двойного ввода.

Поэтому я больше не пытаюсь передать файлы awk, я хочу передать переменные.

Если бы я имел дело с одной переменной, я бы знал, что буду делать:

 echo "$var1" | awk '{$1=$2=""; print $0}' 

Но я не могу найти пример того, как передать вторую переменную / поток в awk в сценарии bash.

примеры, которые я пробовал:

 awk 'FNR==NR{a[$2]=$1;next}($2 in a){if(a[$2]!=$1)print $2}' "$var1" "$var2" echo "${var1}" | awk 'FNR==NR{a[$2]=$1;next}($2 in a){if(a[$2]!=$1)print $2}' "${var2}" awk -v s1="$var1" -v s2="$var2" 'FNR==NR{a[$2]=$1;next}($2 in a){if(a[$2]!=$1)print $2}' "$s1" "$s2" 

редактировать:

Для некоторого фона это очень упрощенная версия, но у меня есть набор файлов, несколько похожих на это:

 :~/test$ ls -lR ?/file* -rw-rw-r-- 1 madivad madivad 11 Apr 19 23:17 1/file.0 -rw-rw-r-- 1 madivad madivad 6 Apr 19 23:04 1/file.1 -rw-rw-r-- 1 madivad madivad 8 Apr 19 23:04 1/file.2 -rw-rw-r-- 1 madivad madivad 8 Apr 19 23:04 1/file.3 -rw-rw-r-- 1 madivad madivad 6 Apr 19 23:05 2/file.1 -rw-rw-r-- 1 madivad madivad 10 Apr 19 23:06 2/file.3 -rw-rw-r-- 1 madivad madivad 6 Apr 19 23:05 2/file.4 -rw-rw-r-- 1 madivad madivad 11 Apr 19 23:17 2/file.5 

У меня также есть два файла аудита, которые содержат результаты хэширования каждой структуры каталогов, которая может охватывать очень глубоко и содержит 500 Мбайт + данных.

В командной строке я написал несколько инструментов для поиска дубликатов, вида возраста и размера, поиска отсутствующих файлов и т. Д. Я пытаюсь более автоматизировать процесс и сам его содержать внутри пакетного файла. Я на самом деле все это записал в пакетном файле и использовал жесткий диск в качестве места для царапин, т. Е. Я сохраняю каждый вывод на жесткий диск в виде файла, а следующая пакетная линия загружает этот файл и продолжает. Моя цель – избавиться от всех лишних файлов.

Структура файла имеет стандартный вывод hashdeep но я уже манипулировал им, чтобы содержать только фиксированную строку хэшей, пару пробелов, а затем полный путь и имя файла. Он начинается следующим образом:

 ~/test$ head 2/audit? ==> 2/audit1 <== %%%% HASHDEEP-1.0 %%%% size,md5,sha256,filename ## Invoked from: /home/madivad/test/1 ## $ hashdeep -l file.0 file.1 file.2 file.3 ## 11,3213c6d334141924ab1454f0349a0ccb,6f92601344e16851316e7cda90d053c0ad234e047ccf81ce6fe89e78bbdb111e,file.0 8,736e5da8b598eec84d4ec0e1be63b6d1,eeda2f21a9320e751d98a92ceb903bdf5e9e5b6f6ca3690fdc0fb67b70a5efb2,file.2 8,e487aeec573e0936c1ac9f091130c20b,1bbb337a707d059be503510600b59292bbc9b1a171fe2b0b07ec122bc2bbff4f,file.3 6,fa8f294721ab3fbb37793c68ff2cf09b,32c66107f0f4f2053128e519681fc8e88806d0d2b17607ce9f2362aff66ad6c7,file.1 ==> 2/audit2 <== %%%% HASHDEEP-1.0 %%%% size,md5,sha256,filename ## Invoked from: /home/madivad/test/2 ## $ hashdeep -l file.1 file.3 file.4 file.5 ## 11,3213c6d334141924ab1454f0349a0ccb,6f92601344e16851316e7cda90d053c0ad234e047ccf81ce6fe89e78bbdb111e,file.5 6,9e87b0fde0cf6b641bd4a27aee5f5536,247ed9d62df1b8b2da7dedf48b0795ef302d21811885180384c3f560c819d361,file.4 6,fa8f294721ab3fbb37793c68ff2cf09b,32c66107f0f4f2053128e519681fc8e88806d0d2b17607ce9f2362aff66ad6c7,file.1 10,b7b9e4419c0708f401d45f061ac9a231,fcfecc7079ad08912d7a0ebcb24816442067b101a0da0c252533b78e00c19c52,file.3 

и к тому времени, когда я добрался до обработки awk меня уже есть это:

 ~/test$ head 2/so* ==> 2/sort1 <== 3213c6d334141924ab1454f0349a0ccb6f92601344e16851316e7cda90d053c0ad234e047ccf81ce6fe89e78bbdb111e file.0 736e5da8b598eec84d4ec0e1be63b6d1eeda2f21a9320e751d98a92ceb903bdf5e9e5b6f6ca3690fdc0fb67b70a5efb2 file.2 e487aeec573e0936c1ac9f091130c20b1bbb337a707d059be503510600b59292bbc9b1a171fe2b0b07ec122bc2bbff4f file.3 fa8f294721ab3fbb37793c68ff2cf09b32c66107f0f4f2053128e519681fc8e88806d0d2b17607ce9f2362aff66ad6c7 file.1 ==> 2/sort2 <== 3213c6d334141924ab1454f0349a0ccb6f92601344e16851316e7cda90d053c0ad234e047ccf81ce6fe89e78bbdb111e file.5 b7b9e4419c0708f401d45f061ac9a231fcfecc7079ad08912d7a0ebcb24816442067b101a0da0c252533b78e00c19c52 file.3 9e87b0fde0cf6b641bd4a27aee5f5536247ed9d62df1b8b2da7dedf48b0795ef302d21811885180384c3f560c819d361 file.4 fa8f294721ab3fbb37793c68ff2cf09b32c66107f0f4f2053128e519681fc8e88806d0d2b17607ce9f2362aff66ad6c7 file.1 

С конкретной строкой, которую я пытаюсь запустить в соответствии с этим вопросом, я ожидал бы, что указанный выше ввод будет содержать имя файла $2 только если имя файла появится в обоих файлах, но хэши a[$2] and $ 1` не совпадают.

Поэтому для вышеприведенного ввода я бы только ожидал увидеть:

 file.3 

One Solution collect form web for “передача двух переменных потоков в качестве входных данных в awk в скрипте”

Учитывая эти переменные:

 $ a=$'one\ntwo';echo "$a" one two $ b=$'three\nfour';echo "$b" three four 

Это некоторые возможные варианты:

 $ printf '%s\n%s\n' "$a" "$b" |awk '{print NR,$0}' $ awk '{print NR,$0}' <(echo "$a") <(echo "$b") #process substitution as per Kusalananda's comment $ echo "$a" |awk '{print NR,$0}' - <(echo "$b") $ { echo "$a" && echo "$b";} |awk '{print NR,$0}' #or even { echo "$a";echo "$b";} $ awk '{print NR,$0}' <(echo "$a";echo "$b") $ awk '{print NR,$0}' <<<$(echo "$a";echo "$b") 

Все приведенные выше примеры дают:

 1 one 2 two 3 three 4 four 

Если переменные заканчиваются новой строкой (т.е. переменные содержат содержимое файлов), как этот шаблон:

 $ a=$'one\ntwo\n' $ b=$'three\nfour\n' 

Тогда и это работает:

 $ awk '{print NR,$0}' <<<"$a$b" 1 one 2 two 3 three 4 four 5 
  • Извлеките первые две части каждой линии, используя awk
  • Обработка двух файлов с помощью awk
  • найти общие строки в каждом столбце в одном файле
  • awk: добавьте поле автоинкремента в файл
  • Фильтровать столбцы на основе значения другого столбца
  • Используйте переменную оболочки с Awk
  • Использовать awk для вставки строки после вывода N
  • / etc / shadow & gawk
  • помощь awk для печати из определенного столбца до конца
  • Распечатайте файл с отменой определенного символа и перейдите в другой существующий файл
  • Сопоставьте первые поля двух разделенных табуляцией файлов и значений соответствия печати
  • Сортировка dhcpd.conf
  • Linux и Unix - лучшая ОС в мире.