Чтобы все знали -Я использовал эту опцию, муру. Я на самом деле пробовал оба варианта, опубликованных выше.
С небольшой модификацией... Я делал примерно 3 файла в секунду с исходными 50 строками кода. Теперь я делаю около 30 -50 секунд.
для гг в {1998..2018} делать y=${yy #[0 -9][0 -9]} #удалить первые две цифры года mv -v./sync1/_D????$y "/cygdrive/d/RAID5/RAID200/tape _backup/$yy" #mv -v./sync1/_D????'$y ' "/cygdrive/d/RAID5/RAID200/tape _backup/$yy" сделано
:)
Такой скрипт может работать:
cd /path/to/direcrtory
for i in *.vcf
do
awk '{if (FNR==1) $10=FILENAME; print}' "$i" >"$i.tmp" && mv -f "$i.tmp" "$i"
done
«Магия» находится в переменной FILENAME
, которая в awk
содержит имя входного файла
Предположим, что ваши файлы разделены пробелами, это должно работать:
for f_name in HR[0-9]*.vcf; do
awk -v f="${f_name%.*}" 'NR == 1 {$10 = f}1' "$f_name" > "$f_name.tmp"
mv "$f_name.tmp" "$f_name"
done
Зациклиться внутри каталога и захватить каждый vcf
файл. Затем удалите расширение из имени файла с помощью ${f_name%.*}
и передайте его в качестве параметра в awk
.
awk
будет использовать это имя файла для замены. ПРИМЕЧАНИЕ.:это нужно запустить в том же каталоге, что и файл vcf
. Если вы хотите запустить его из другого пути, используйте следующий:
for f_name in /some/full/path/HR[0-9]*.vcf; do
# remove the path
f="${f_name##*/}"
awk -v f="${f%.*}" 'NR == 1 {$10 = f}1' "$f_name" > "$f_name.tmp"
mv "$f_name.tmp" "$f_name"
done
Если файлы не разделены пробелами, исправьте awk FS
.
ИЗМЕНИТЬ НОВЫЕ ЗАПРОСЫ И НА ОСНОВЕ УЛУЧШЕНИЙ @Ed Morton
I am interested in the row that start with #CHROM, which is row # 237 and the column #10 of that row 237 contains $i
for f_name in /some/full/path/HR[0-9]*.vcf; do
# remove the path
f="${f_name##*/}"
awk -F'\t' -v f="${f%.*}" 'NR == 237 {$10 = f}1' "$f_name" > "$f_name.tmp" && mv "$f_name.tmp" "$f_name"
done
Эта новая версия скриптов делает замену имени файла только в том поле, которое вам нравится ($10 = f)
и в той строке, которую вы хотите (NR == 237)
. Параметр awk
-F\t
устанавливает, как awk
видит строки и разделяет их в полях.
Еще раз спасибо @Ed Morton за улучшение оригинальных сценариев :Как вы можете видеть, оператор :mv "$f_name.tmp" "$f_name"
, который представляет собой команду перезаписать старый файл содержимым нового (, созданного awk
), сжат в одну строку :awk '' file > tmp && mv tmp file
, таким образом, если команда awk
терпит неудачу. правая часть &&
не выполняется, и исходные данные будут сохранены
@YetAnotherUser, см. изображение примера файла относительно моего запроса :«Заменить заголовок данного столбца именем файла»