Как видно из вашего ввода, у вас есть символ пробела в переменной sub4, поэтому перепишите эту строку:
grep $sub4 modded_file.csv.dat;
to be
grep -- "$sub4" modded_file.csv.dat;
(Дополнения от @philippos).
И $sub4
не должен содержать одинарных кавычек '
, потому что они будут считаться частью шаблона поиска.
Я думаю, что ваше заблуждение заключается в порядке выполнения кавычек и расширения: Вы думаете, что сначала расширяются переменные, а затем выполняется цитирование, поэтому после расширения одинарные кавычки переменной будут заключать строку в кавычки. Но на самом деле цитирование выполняется до расширения переменной, поэтому вам нужно заключить в кавычки $sub
Выполнение grep
внутри цикла - это огромный антипаттерн. Попробуйте вместо этого следующее.
awk -F "," 'NR==FNR { key[$1]=$2; value[$1]=$3; next }
($1 in key) && ($0 !~ "^" $1 ",.*," key[$1] "," value[$1] ",")' input.csv modded_file.csv.dat
Я не пытался понять, почему вы хотите или ожидаете \r
там каким-то образом, так что это, вероятно, требует некоторой доработки.
Awk скрипт состоит из последовательности пар *condition {
action }
, которые применяются по очереди к каждой входной строке. Вы можете использовать next
, чтобы пропустить оставшийся сценарий для этой строки ввода и перейти к следующей, и вы можете опустить часть {
action }
если вы просто хотите вывести всю строку ввода. (Вы также можете опустить условие, если хотите сделать что-то безусловно). Каждая строка разбивается на поля, которые доступны как $1
, $2
и т.д. внутри сценария. -F ","
устанавливает разделитель полей на запятую (по умолчанию это последовательность пробелов).
Идиома NR==FNR
является распространенным способом обработки двух входных файлов в Awk. Общий номер строки NR
будет равен номеру строки внутри файла FNR
, когда вы обрабатываете первый входной файл, и ложным впоследствии.
Когда мы читаем первый файл, мы храним поля в двух ассоциативных массивах, оба из которых имеют ключ по первому полю.
Когда мы читаем второй файл, мы печатаем каждую строку ввода, где ключ находится в массиве key
, а вся строка не соответствует ожидаемому регулярному выражению (первое поле - ключ, затем все, затем запятая, имя столбца, которое мы храним в key[$1]
, еще одна запятая, ожидаемое значение, которое мы храним в value[$1]
, и еще одна запятая).
Другими словами, это находит строки, где ожидаемое условие не было выполнено. Уберите !
, если вы хотите получить вместо этого совпадения.