2015-03-05 3 views
0

awk имеет функцию getline var, которую я часто использую для извлечения строк файла, в котором определенный столбец (второй в приведенном ниже примере) соответствует строкам другого файла:awk getcolumn var вместо getline var

awk 'BEGIN {while(getline each_line < "patterns_file.txt") my_patterns[each_line]} $2 in my_patterns' file_to_search.txt 

вместо как я могу получить только указанный столбец из patterns_file.txt в my_patterns массив, если он имеет более чем один столбец, и мне нужно только определенный столбец для сопоставления (скажем, четвёртом), что-то вроде:

awk 'BEGIN {while(getcolumn each_4th_column < "patterns_file.txt") my_patterns[each_4th_column]} $2 in my_patterns' file_to_search.txt 
+0

'getline' * иногда * решение, не всегда (см. Интересную статью по этому поводу Эд Мортон] (http://awk.freeshell.org/AllAboutGetline)). Поэтому вам лучше разместить некоторые вводные, выходные и четкие пояснения о том, какова ваша конечная цель, поскольку это может быть сделано по-другому. – fedorqui

ответ

1

Код в вашем вопросе - это анти-шаблон в awk. Рекомендуемый способ делать то, что вы хотите, как это:

awk 'NR==FNR {my_patterns[$4];next} $2 in my_patterns' patterns_file.txt file_to_search.txt 

Там нет необходимости вручную использовать getline в этом случае. Вместо этого первый блок запускается для первого файла и устанавливает ключи в массиве. FNR==NR - это идиоматический способ определения того, что обрабатывается первый файл (поскольку FNR - это номер записи в текущем файле, а NR - это номер общей записи). Использование next означает, что часть за пределами блока пропускается для первого файла.

+2

он работает уже! и это короче и легче читать. –

+1

@Omer рад это слышать. Конечно, вы можете изменить '$ 4' на' $ 0' вместо использования 'getline var'. –

+1

Решила ли ваша проблема, @Omer? Поскольку вы новичок здесь, пожалуйста, не забудьте отметить ответ, принятый, если ваша проблема уже решена. Вы можете сделать это, нажав на галочку рядом с ответом, чтобы переключить ее с полого на зеленый. См. [Справочный центр> Задать вопрос] (http://stackoverflow.com/helpcenter/someone-answers), если у вас есть какие-либо сомнения! – fedorqui