Удаление строк на основе значений столбцов в файле с помощью awk команду

У меня есть огромный файл как ниже. Я хочу удалить строки, если второй столбец имеет значения 60,30 и т.д., все эти значения, которые я получу из другого файла в запятой, разделили файл.

position_id risk_measure_id Scenario_id value_usd
1   60  0   300.8
2   30  0   400.6
3   45  90  300.7
4   60  0   200.9
5   30  9   400.8
6   60  10  4000.9
8   20  0   5000.9

Я могу использовать ниже awk команда для достижения его, но если у меня есть несколько значений для исключения, является там любым простым способом.

$ awk '{ if ($2!=60 && $2!=25 && $2!=30) print $0}' test.txt
position_id risk_measure_id Scenario_id value_usd
3   45  90  300.7
8   20  0   5000.9
3
задан 12 January 2017 в 06:18

2 ответа

Ваша команда может быть упрощена далее - Вам не нужно if блок операторов и блок кода, потому что awk может распечатать условие соответствия использования строк, которое предшествует блоку кода. Если Вы только хотите распечатать строку, блок кода может быть пропущен в целом:

$ awk '$2!=60 && $2!=25 && $2 != 30'  input.txt        
position_id risk_measure_id Scenario_id value_usd
3   45  90  300.7
8   20  0   5000.9

Альтернативное решение состояло бы в том, чтобы использовать массив:

awk -v values="60 30 25" 'BEGIN{split(values,array)};{ flag=0; for(val in array) if (array[val] == $2) flag=1; if (flag==0) print }'  input.txt

, Что происходит, существует, мы создаем строку со всеми значениями, которые мы хотим, разделенный пространством. В операторе BEGIN мы разламываем его, на выстраивают. Основные наборы блока кода отмечают переменную к 0 после чтения каждой строки, затем мы циклично выполняемся через все значения в массиве и проверке, если поле № 2 соответствует чему-нибудь в массиве. Если это делает, мы устанавливаем флаг на 1. После того, как цикл выходит, мы видим, нашел ли цикл что-нибудь и установил флаг, и если он не сделал - печатают строку.

Более короткая версия этого подхода состоит в том, чтобы использовать next команда для повреждения от цикла, если исключенное значение найдено. Таким образом, print функция достигнута, только если нет никакого исключенного найденного значения:

awk -v values="60 30 25" 'BEGIN{split(values,array)};{for(val in array) if (array[val] == $2) next; print}'  input.txt 
1
ответ дан 1 December 2019 в 15:34

Поместите свои значения в другой файл:

values:

60
25
30

Затем считайте их в массив в awk:

awk 'FNR == NR {arr[$0] = 1; next} !($2 in arr)'  values test.txt

FNR == NR сохраняется при чтении первого файла, таким образом, первый блок только выполняется при чтении значений. Из-за next, !($2 in arr) только выполняется для второго файла.

4
ответ дан 1 December 2019 в 15:34

Другие вопросы по тегам:

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