Стандартное решение такой задачи — сделать две петли:
for i in $(<days); do
for j in $(<hours); do
grep "$i $j" file > data-"$i-$j"
done
done
Обратите внимание, что я изменил обратные кавычки на $()
для подстановки команд, убрал дохлых котов и добавил двойные кавычки.
Кажется, нет никаких причин хранить данные в переменной.
awk -v OFS='">' '{ print $0, $0 }' 1.txt >2.txt
Это сделает то, что вы, кажется, хотите сделать, а именно вставит два символа ">
в конце каждой строки, за которыми следует исходное содержимое строки. В этом коде это делается путем вывода строки в виде двух новых полей. Разделитель выходных полей OFS
будет вставлен между ними автоматически. Значение OFS
устанавливается равным ">
в командной строке.
В качестве альтернативы, используяsed
:
sed 's/\(.*\)/\1">\1/' 1.txt >2.txt
При этом используется группа захвата для захвата всей строки. Затем он заменяется захваченным битом, строкой ">
и снова захваченным битом.
Как указано в комментариях, еще более коротким вариантом будет
sed 's/.*/&">&/' 1.txt >2.txt
Когда &
встречается в замещающей части команды s
, он будет заменен битом ввода, соответствующим выражению. Выражение .*
, поэтому &
будет полной строкой,и &">&
вставит строку дважды с ">
в -между ними.
Ваш конвейер,
URL=$(grep ".*"./1.txt) | sed "s/$/\">${URL}/"./1.txt >./2.txt
не имеет особого смысла, так как левая и правая его части выполняются независимо друг от друга (и между ними нет связи ). Значение $URL
будет пустым в выражении sed
.
Если бы вы использовали
URL=$(grep ".*"./1.txt); sed "s/$/\">${URL}/"./1.txt >./2.txt
, что совпадает с
URL=$(<./1.txt); sed "s/$/\">${URL}/"./1.txt >./2.txt
команда sed
попыталась бы вставить полное содержимое переменной $URL
(всего1.txt
)в конце каждой строки. Это также не удалось бы, так как это значение содержит несколько символов /
, которые мешали бы разделителям /
команды s
.