Задача 1:
Обрабатывать файлы, расположенные в /path
, имя которых начинается с 201
, за которым следует одна цифра между 2
и 6
, за которой следует любой символ.
Разбейте каждую строку на символ /
и составьте строку с полями 5
, 6
, 7
и 8
, со знаком /
между ними, за которым следует ",0,0,0"
. ] нить.
Сохраните эту строку и любые последующие строки в файле с именем файла, имя которого archives_201
, за которым следует та же единственная цифра, которая была ранее во входном имени файла, с расширением .csv
.
Решение 1:
awk -F/ '
FNR==1 {match(FILENAME, /\/(201[2-6])/, m)}
{print $5"/"$6"/"$7"/"$8",0,0,0" >> "archives_"m[1]".csv"}
' /path/201[2-6]*
Комментарии:
Поскольку вы не предоставляете образцы входных файлов и желаемый результат, мне пришлось гадать по нескольким пунктам.
Я понятия не имею, чего вы пытаетесь добиться с помощью:> ${8:0:4}"_export_0504.csv"
.
Конвейер find
результатов в awk
оставляет меня в недоумении :вы хотите, чтобы awk
действительно читал каждый файл или просто обрабатывал текстовый список? Если последнее, жесткая композиция полей ($5"/"$6"/"$7"/"$8)
означает, что вы ожидаете, что все файлы будут в одном каталоге, так зачем вообще использовать find
?
Я предположил, что нет никакой части пути, кроме имени файла, который начинается со строки поиска 201[2-6]
. Я предположил, что вы хотите добавить(>>
)несколько строк в один и тот же файл, а не перезаписывать его при необходимости(>
). Я предположил, что все файлы находятся в одном каталоге, и я предположил, что awk
должен работать с файлом содержимым , а не с именами файлов .
Однако выбор /
в качестве разделителя полей намекает на последнюю гипотезу, поэтому я попытаюсь решить и эту проблему.
Задача 2:
Обрабатывать имена файлов, находящихся в /path
, чье имя начинается с 201
, за которым следует одна цифра между 2
и 6
, за которой следует любой символ.
Разделите каждое имя файла на символ /
и составьте строку с 5-м, 6-м, 7-м,и 8-й компонент (, сохраняющий /
между ними ), за которым следует строка ",0,0,0"
.
Сохраните эту строку и все последующие в файле с именем archives_201
, за которым следует та же единственная цифра, которая была ранее в имени файла, с расширением .csv
.
Решение 2:
awk -F/ '
FNR==1 {
match(FILENAME, /\/(201[2-6])/, m);
$0=FILENAME;
print $5"/"$6"/"$7"/"$8",0,0,0" >> "archives_"m[1]".csv"
}
' /path/201[2-6]*
Простое экранирование с помощью обратной косой черты работает.
map \# focus_inputbar ":blist "