Во-первых, я довольно новичок в скрипте bash.
Итак, у меня есть 2 файла, давайте назовем их A и B.
В A есть URL-адреса, а в B несколько журналов. Что я хочу, так это вставлять $ actual_count после каждого вхождения $ element
Для 1 $ element есть только 1 $ actual_count
IFS=',' read -r -a array < $1
for element in "${array[@]}"
do
actual_count=`cat $2 | grep $element |grep css | wc -l`
sed -i ':'"$element"': a '"$actual_count"'' daily_output
done
, этот код возвращает меня после найденного $ element [ 115]
все $ actual_count этого цикла возводятся в квадрат и умножаются на все элементы массива.
Like (все $ actual_count, сгенерированные в этом цикле) ² * sizeof array. (Это много).
Я не знаю, где я все испортил.
Я надеюсь, что вы можете мне помочь.
Извините за мой плохой английский xD
С уважением, fune
Редактировать: если я использую фиксированный шаблон поиска, то он работает нормально.
Некоторые замечания, не только касающиеся вашего первоначального вопроса, но, надеюсь, полезные:
cat $2 | grep $element
- бесполезная труба. Вы можете указать grep $element $2
grep $element |grep css
, решать, появляются ли $element
и css
в фиксированном порядке в строке. В этом случае было бы лучше объединить их в нечто вроде "$element.*css"
или наоборот grep css | wc -l
можно заменить на grep -c css
(grep -c
возвращает количество совпадающих строк) ':'"$element"': a '"$actual_count"''
состоит из пяти элементов с изменяющим цитированием (последний из которых пустой!). Вы можете сложить все в двойные кавычки, чтобы достичь того же: ":$element: a $actual_count"
sed
? Давайте посмотрим на скрипт после расширения: :this/is/the/first.html: a 2
должен делать что? Это просто метка (метка прыжка) и ничего не делает. Но на самом деле я не вижу необходимости в sed
здесь. Чтобы получить заданный вывод, внутренней части цикла просто нужно вывести $element
и в следующей строке количество совпадающих строк:
echo $element
echo $(grep -c "$element.*css" $2)