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

Удалить строки из файла с помощью 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?

решение1

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

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

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

решение2

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

grep -v "^$req_file_curr," file

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

Если это так, вам придется экранировать эти символы или с помощью awk, вы можете использовать подход, использующий его index()функцию:

S="$req_file_curr," awk 'index($0, ENVIRON["S"]) != 1' < file

решение3

Вы установили 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

решение4

Решением для ED было бы что-то вроде этого.

  req_file_curr=req1

  printf '%s\n' "g/^$req_file_curr/d"  w | ed -s temp.csv

Он редактирует файл на месте, поэтому сначала протестируйте, прежде чем запускать его в своих файлах.

Связанный контент