У меня есть огромный файл как ниже. Я хочу удалить строки, если второй столбец имеет значения 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
Ваша команда может быть упрощена далее - Вам не нужно 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
Поместите свои значения в другой файл:
values
:
60
25
30
Затем считайте их в массив в awk
:
awk 'FNR == NR {arr[$0] = 1; next} !($2 in arr)' values test.txt
FNR == NR
сохраняется при чтении первого файла, таким образом, первый блок только выполняется при чтении значений. Из-за next
, !($2 in arr)
только выполняется для второго файла.