Заменить заголовок данного столбца именем файла

Чтобы все знали -Я использовал эту опцию, муру. Я на самом деле пробовал оба варианта, опубликованных выше.

С небольшой модификацией... Я делал примерно 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" сделано

:)

-2
26.05.2021, 15:35
3 ответа

Такой скрипт может работать:

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содержит имя входного файла

0
28.07.2021, 11:29

Предположим, что ваши файлы разделены пробелами, это должно работать:

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терпит неудачу. правая часть &&не выполняется, и исходные данные будут сохранены

0
28.07.2021, 11:29

enter image description here@YetAnotherUser, см. изображение примера файла относительно моего запроса :«Заменить заголовок данного столбца именем файла»

0
28.07.2021, 11:29

Теги

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