Grep переменная в файле [duplicate]

-2
26.04.2017, 09:36
2 ответа

Как видно из вашего ввода, у вас есть символ пробела в переменной sub4, поэтому перепишите эту строку:

grep $sub4 modded_file.csv.dat;

to be

grep -- "$sub4" modded_file.csv.dat;

(Дополнения от @philippos). И $sub4 не должен содержать одинарных кавычек ', потому что они будут считаться частью шаблона поиска.

Я думаю, что ваше заблуждение заключается в порядке выполнения кавычек и расширения: Вы думаете, что сначала расширяются переменные, а затем выполняется цитирование, поэтому после расширения одинарные кавычки переменной будут заключать строку в кавычки. Но на самом деле цитирование выполняется до расширения переменной, поэтому вам нужно заключить в кавычки $sub

3
28.01.2020, 05:15

Выполнение 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], и еще одна запятая).

Другими словами, это находит строки, где ожидаемое условие не было выполнено. Уберите ! , если вы хотите получить вместо этого совпадения.

1
28.01.2020, 05:15

Теги

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