Это хорошо и просто:
perl -i -n -e 'print unless $.==13' /path/to/your/file
чтобы удалить, например, строку 13 из /path/to/your/file
Использовать петлю:
#!/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
Удалить. *из $ARGV, затем добавьте \t $ARGV в файл:
perl -i -pe '$ARGV=~s/\..*//; s/$/\t$ARGV/;' NA*
Решение Гленна, скорее всего, работает быстрее:
perl -i -lpe '$_.= " ". substr($ARGV,0,index($ARGV,"."))' NA*
хотя, если каждый файл состоит только из одной строки, большую часть времени поиск будет выполняться на диске.
простой удар
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}
выполняет поиск -и -замену значения переменной. (задокументировано в руководстве)%
, шаблон закрепляется в конце строки. Здесь я сопоставляю пустой шаблон в конце строки. Откровенно говоря, такой подход слишком умный, и я бы выбрал что-то более очевидное.
Этот метод совместим с 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
в конец команды.