Использование массива строк в команде gawk в Linux

У меня проблемы с применением команды gawk к массиву строк.

Сама по себе команда gawk работает нормально:

$ gawk '$1 == "name" {print $0}' Data1.txt >> Data2.txt 

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

Однако мне приходится выполнять эту процедуру пару раз, и при попытке выполнить следующее, похоже, ничего не получается:

$ array=("name1" "name2")
$ for i in "${array[$@]}"; do gawk '$1 == $i {print $0}' Data1.txt >> Data2.txt; done

сам массив выглядит нормально, так как он работает, когда я заменяю команду gawk командой echo. Я также пытался заменить $i на «$i», ${i}, «${i}» и т. д., но это не помогло.

Любая идея, что я делаю неправильно ?? Я новичок в Linux, поэтому заранее извините за мой нубский вопрос!


person RMulder    schedule 05.07.2015    source источник
comment
К сожалению, ' "$i" ' (или '$i') тоже ничего не вставляет в мой файл Data2.txt. Теперь я понимаю, почему gawk не реагирует на мой $i, однако, спасибо за это!   -  person RMulder    schedule 05.07.2015
comment
Да, я заметил, что пробелы не нужны, но, к сожалению, без них я тоже ничего не получаю.   -  person RMulder    schedule 05.07.2015
comment
гах, см. stackoverflow.com/questions/8880603/ мои воспоминания о синтаксисе массива bash были ужасны.   -  person msw    schedule 05.07.2015
comment
Крайне маловероятно, что вы подходите к этому правильно, поскольку каждый раз, когда вы пишете цикл в оболочке для манипулирования текстом, у вас неправильный подход. Правильный подход, вероятно, заключается в том, чтобы делать все это в awk, но нам нужно больше знать о том, что вы делаете с примерами ввода и ожидаемым результатом, чтобы помочь вам в этом.   -  person Ed Morton    schedule 06.07.2015
comment
Это то, что я обнаруживаю, однако я понятия не имею, как создать массив в (g) awk. Data1 — это текстовый файл, содержащий более 400 000 переменных. Имя каждого столбца начинается с имени переменной, а в других столбцах содержится дополнительная информация об этой переменной. Я хочу извлечь определенные переменные по их имени и скопировать их информацию в новый текстовый файл Data2. Поскольку у меня есть много имен переменных, информацию о которых я хочу получить, мне кажется, что цикл по массиву из них намного быстрее.   -  person RMulder    schedule 06.07.2015


Ответы (1)


Правильный способ сделать это так:

for i in "${array[@]}"
do
  awk '$1 == i' i="$i" Data1.txt
done > Data2.txt

Если вы хотите избежать создания переменной awk, вы можете сделать это, но я не советую этого делать, потому что это изменяет область действия переменной:

export i
for i in "${array[@]}"
do
  awk '$1 == ENVIRON["i"]' Data1.txt
done > Data2.txt
person Steven Penny    schedule 06.07.2015