Для всех файлов в папке со строкой на имя увеличьте стоимость в ячейке (2,9) в конец имени файла

Хорошо, у меня есть много файлов в папке, которые имеют строку "$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}' {} \;

То, с чем я борюсь, - то, как поместить ту строку как последнюю вещь перед расширением в тех именах файлов

1
задан 29 June 2018 в 11:48

2 ответа

Необходимо получить значение и создать новое имя файла с ним.

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$, и т.д.

3
ответ дан 3 December 2019 в 06:37

Вот GNU parallel Install 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 команда просто добавляется с помощью Замены Команды.

2
ответ дан 3 December 2019 в 06:37

Другие вопросы по тегам:

Похожие вопросы: