Хорошо, у меня есть много файлов в папке, которые имеют строку "$varname.txt"' на их имя:
for file in find output/ -name "*$varname*.txt" -type f; do echo $file; done
...
теперь эти файлы у всех есть две строки и 9 столбцов им. Я хочу добавить содержание строки 2, седло 9 в конец их filname (прямо перед .txt
).
Таким образом, я знаю, как распечатать значение в ячейке (2, 9) всех этих файлов:
find output/ -name "*$varname*.txt" -type f -exec awk -F' ' 'NR==2{print $9}' {} \;
То, с чем я борюсь, - то, как поместить ту строку как последнюю вещь перед расширением в тех именах файлов
Необходимо получить значение и создать новое имя файла с ним.
find output/ -name "*$varname*.txt" -type f -exec sh -c '
for file; do
value=$(awk "NR==2 {print \$9; exit}" "$file")
echo mv "$file" "${file%.*}$value.${file##*.}"
done
' sh {} +
Я призываю сценарий оболочки -exec
директива, передавая несколько имен файлов ему (с -exec ... +
вместо -exec ... \;
)
Запаздывание "sh" становится 0$, и имена файлов входят в 1$, 2$, и т.д.
Вот GNU parallel
подход:
find output/ -name "*$varname*.txt" -type f -print0 |
parallel -0 'echo mv {} {.}$(awk -F" " "NR==2{print\$9}" {}).{=s/.*\.//=}'
Это передает разграниченный нулем список файлов по каналу к parallel
который перечисляет команды переименования – удаляют echo
если это делает правильную вещь. parallel
идет с удобными замещающими строками, {}
заменяется (в настоящее время обрабатываемый) входное имя файла, {.}
входным именем файла без расширения и с {=perl expression=}
можно выполнить что-либо perl
может сделать, как замена здесь. Вывод Вашего awk
команда просто добавляется с помощью Замены Команды.