Grep переменной в файле

Grep переменной в файле

Файл изменяется скриптом с использованием входного файла-

141,141_1,BAR,HONDA,ps2_0,не назначено,ps3_0,не назначено,ps4_0,не назначено,ps5_0,не назначено,ps6_0,не назначено,ps7_3,ПОКА НЕ БУДЕТ,.....

Входной файл-

141,ps7,ПОКА БУДЕТ

Теперь мне нужно проверить, обновлен ли столбец ps7_3 правильным значением.

Итак, из входного файла я выделил столбцы:

while read -r line;
do
sub1=$(echo $line|cut -f 1 -d ',');
sub2=$(echo $line|cut -f 2 -d ',');
sub3=$(echo $line|cut -f 3 -d ',');
sub4=$(echo $sub2'.*,'$sub3|sed -e "s/\(.*\)\r/'\1'/");
echo $sub1;
echo $sub2;
echo $sub3;
echo $sub4;
grep $sub4 modded_file.csv.dat;
done<input.csv

Выход -

141
ps7
TILL WILL
'ps7.*,TILL WILL'
grep: WILL': No such file or directory

Но когда я запускаю grep 'ps7.*,TILL WILL' modded_file.csv.dat, это работает. Как мне выполнить grep переменной, как показано выше, в файле?

решение1

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

grep $sub4 modded_file.csv.dat;

быть

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

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

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

решение2

Работа 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 }, которые применяются по очереди к каждой строке ввода. Вы можете использовать , nextчтобы пропустить оставшийся скрипт для этой строки ввода и перейти к следующему вводу, и вы можете опустить{действие}часть, если вы просто хотите распечатать всю входную строку. (Вы также можете опуститьсостояние если вы хотите сделать что-то безусловно.) Каждая строка разделена на поля, которые доступны как $1, $2и т. д. внутри скрипта. -F ","устанавливает разделитель полей на запятую (по умолчанию это последовательность пробелов).

Идиома NR==FNR— это распространенный способ обработки двух входных файлов в Awk. Общий номер строки NRбудет равен номеру строки в файле FNR, когда вы обрабатываете первый входной файл, и false впоследствии.

При чтении первого файла мы сохраняем поля в двух ассоциативных массивах, оба из которых имеют ключевое значение по первому полю.

При чтении второго файла мы печатаем каждую входную строку, где в массиве найден ключ key, и вся строка не соответствует ожидаемому регулярному выражению (первое поле — это ключ, за которым следует что угодно, затем запятая, имя столбца, которое мы сохранили в key[$1], еще одна запятая, ожидаемое значение, которое мы сохранили в value[$1], и еще одна запятая).

Другими словами, это находит строки, где ожидаемое условие не было выполнено. Уберите !вместо этого if you want the matches.

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