разделение массива и отправляет значения в hashset в awk

Можно получить то, на что указывает тег фиксации:

git show -s 'TAG_NAME^{commit}' --format='%H'

Unfortunatly я боюсь, что единственный способ проверить, отмечена ли фиксация он для проверки всех тегов.

2
02.03.2012, 21:12
2 ответа

Единственная конструкция, которая устанавливает много элементов массива сразу, split функция (по крайней мере, в стандарте awk, GNU awk может иметь другие возможности). Это присваивает числовым индексам. Таким образом, Вы не можете выйти из цикла, если Вы хотите сделать ассоциативный массив.

Можно, однако, изменить тест исключения для не использования массива. Если строки для исключения не содержат regexp специального символа (().?*+[]\^$), можно рассматривать значение var как regexp для соответствия против, с небольшой тонкой настройкой. Это может быть немного медленнее, чем использование массива, но вероятно не в известной мере поэтому, если у Вас нет большого количества строк для исключения.

BEGIN { exclude = "^(" var ")$" }
match(dest, exclude) { … }

Другой подход должен рассматривать var как конкатенация строк для исключения; dest должен быть исключен, если, появляется в var между |. Это будет снова медленнее, чем соответствие regexp, но только в известной мере так для достаточно больших списков исключения.

BEGIN { exclude = "|" var "|" }
index(dest, exclude) { … }
1
27.01.2020, 22:23

Я предполагаю, что Ваша секунда "по линии" dest из входного файла, который содержит значения, которые Вы проверяете по исключенным значениям (например, называете этот входной файл "данными").
Можно читать в списке исключенных значений через другой файл (например, названный "исключают"). Если исключают, уже разграничен |, просто используйте sed для изменения их на \n.

Создайте тестовые файлы

sed 's/ /\n/g' <<<"blah1 blah2 abcde" >data
sed 's/|/\n/g' <<<"blah1|blah2|blah3" >exclude

Сценарий

awk '{
  if( NR==FNR ) { exclude[$0]++ 
  }else{ 

    # somewhere later on
    # "dest" to be tested is $1 of "data"
    if( exclude[$1] ) print "do something", $1 
  }
}' exclude data

или что-то вроде этого для передачи этих 2 "файлов" может подойти.:

}' <(sed 's/|/\n/g' <<<"blah1|blah2|blah3") \
   data  

Вывод

do something blah1
do something blah2
0
27.01.2020, 22:23

Теги

Похожие вопросы