как вставить часть имени файла в содержимое файла?

Это хорошо и просто:

perl -i -n -e 'print unless $.==13' /path/to/your/file

чтобы удалить, например, строку 13 из /path/to/your/file

5
02.05.2018, 21:55
4 ответа

Использовать петлю:

#!/bin/bash

shopt -s nullglob
for file in ???????.mapped.*bam_dp; do
  [[ -f "$file" ]] || continue
  id=${file%%.*}              # grab the ID from file name
  sed -i "s/$/ $id/" "$file"  # modify the file in-place
done
2
27.01.2020, 20:35

Удалить. *из $ARGV, затем добавьте \t $ARGV в файл:

perl -i -pe '$ARGV=~s/\..*//; s/$/\t$ARGV/;' NA*

Решение Гленна, скорее всего, работает быстрее:

perl -i -lpe '$_.= " ". substr($ARGV,0,index($ARGV,"."))' NA*

хотя, если каждый файл состоит только из одной строки, большую часть времени поиск будет выполняться на диске.

2
27.01.2020, 20:35

простой удар

for file in *.bam_dp; do 
    contents=$(< "$file")
    echo "$contents ${file%%.*}" > "$file"
done

для многострочных -файлов все еще можно выполнить с помощью обычного bash

for file in *.bam_dp; do 
    mapfile -t contents < "$file"
    printf "%s\n" "${contents[@]/%/ ${file%%.*}}" > "$file"
done

примечания:

  • Команда mapfileсчитывает файл в массив строк.
  • расширение параметра ${var/pattern/string}выполняет поиск -и -замену значения переменной. (задокументировано в руководстве)
    • если шаблон начинается с %, шаблон закрепляется в конце строки. Здесь я сопоставляю пустой шаблон в конце строки.
    • переменная может быть расширением массива, и в этом случае замена происходит для каждого элемента массива.

Откровенно говоря, такой подход слишком умный, и я бы выбрал что-то более очевидное.

4
27.01.2020, 20:35

авк

Этот метод совместим с GNU (Linux )и BSD (Mac )версиями awk.

awk '{ id=FILENAME ; sub(/\..*/,"",id) ; print $0 "\t" id }' *.bam_dp
  • id=FILENAME ; sub(/\..*/,"",id)
    Сохраните первую часть каждого *.bam_dpимени файла (все до первого.)как id.
  • print $0 "\t" id
    Распечатайте содержимое каждого файла, затем символ табуляции, затем idзаписи.

Будет напечатан список со строками, как в вашем примере:

1   115258827   10 NA21143

Исходные файлы не будут изменены. Вы можете сохранить этот вывод, например, добавив > file.txtв конец команды.

1
27.01.2020, 20:35

Теги

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