Intereting Posts
Замена процесса в GNU Makefiles Не удалось записать компакт-диск в читаемый мир в NFS Укажите опцию diff для подсказки файла конфигурации dpkg Могу ли я разрешить пользователю без полномочий root регистрироваться, когда существует / etc / nologin? Печать полей с помощью awk Как поменять клавиши Ctrl и Alt в ibus? Расширение размера раздела без его размонтирования Как фильтровать STAT с помощью ps? Не удалось получить соединение D-Bus: неизвестная ошибка -1 пользовательские действия nemo / bash Почему дочерний элемент vfork или fork вызывает _exit () вместо exit ()? Найдите два последовательных паттерна с любым количеством символов между ними, используя grep VirtualBox Гость: CentOS с KDE, Host: MacOS Sierra Mouse Интеграция потеряна (событие не отвечает) как остановить потоки ядра, вытесняющие процессы пользовательского пространства в реальном времени? Настройка системы Linux как устройства OTG

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

У меня есть файл CSV (скажем temp.csv) со строками и числами. Мне нужно удалить строки, содержащие определенный шаблон строки в начале строк в файле. Например, вот мой файл –

req1,incl_patt1,excl_patt1,2,ind1 req1,incl_patt2,excl_patt2,1,ind1 req1,incl_patt3,excl_patt3,4,ind1 req2,inc_patt1,exc_patt1,1,ind2 req2,inc_patt2,exc_patt2,2,ind2 req2,inc_patt3,exc_patt3,3,ind2 req3,pattern3,expatt3,1,ind3 req4,pattern4,expatt4,1,ind4 

Я пишу шаблон для req_file_curr в команде ~ $ req_file_curr=req1

echo "${req_file_curr}" дает результат как req1

Однако при использовании в команде sed , как показано ниже:

 sed '/\"${req_file_curr}\"/d' temp.csv 

дает результат как

 req1,incl_patt1,excl_patt1,2,ind1 req1,incl_patt2,excl_patt2,1,ind1 req1,incl_patt3,excl_patt3,4,ind1 req2,inc_patt1,exc_patt1,1,ind2 req2,inc_patt2,exc_patt2,2,ind2 req2,inc_patt3,exc_patt3,3,ind2 req3,pattern3,expatt3,1,ind3 req4,pattern4,expatt4,1,ind4 

Я рассматриваю вывод как

 req2,inc_patt1,exc_patt1,1,ind2 req2,inc_patt2,exc_patt2,2,ind2 req2,inc_patt3,exc_patt3,3,ind2 req3,pattern3,expatt3,1,ind3 req4,pattern4,expatt4,1,ind4 

Как я могу использовать переменную из оболочки как шаблон для поиска в sed или awk ?

Вы должны заключить шаблон sed в двойные кавычки, чтобы оболочка могла развернуть переменную, прежде чем передавать ее в sed :

 sed "/^${req_file}/d" temp.csv 

Вам также необходимо использовать ^ чтобы указать sed что этот шаблон должен произойти в начале строки.

Нет необходимости в awk или sed здесь:

 grep -v "^$req_file_curr," file 

Обратите внимание, что (например, для sed или awk хотя и в меньшей степени), который предполагает, что $req_file_curr не содержит операторов regexp (например . , * …).

Если это произойдет, вам придется избегать этих символов.

Вы установили req_file_curr но используете req_file . И ваша команда sed не будет работать, поскольку переменная оболочки не может быть расширена в команде sed .

Вы можете попробовать следующее:

 $ sed '/'"${req_file_curr}"'/d' file req2,inc_patt1,exc_patt1,1,ind2 req2,inc_patt2,exc_patt2,2,ind2 req2,inc_patt3,exc_patt3,3,ind2 req3,pattern3,expatt3,1,ind3 req4,pattern4,expatt4,1,ind4 

или с помощью sed с двойной цитатой:

 sed "/${req_file_curr}/d" file 

и используя awk :

 $ awk -v req=$req_file_curr '$0 !~ req' file req2,inc_patt1,exc_patt1,1,ind2 req2,inc_patt2,exc_patt2,2,ind2 req2,inc_patt3,exc_patt3,3,ind2 req3,pattern3,expatt3,1,ind3 req4,pattern4,expatt4,1,ind4