
Файл изменяется скриптом с использованием входного файла-
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.