sed solução:
for f in nexus*; do sed -i "s/^>/$f&/" "$f"; done
Ou usando gawk e sua extensão inplace
(disponível desde o v. 4.1.0):
for f in nexus*; do awk -i inplace '/^>/{ $0=FILENAME$0 }1' "$f"; done
Eu tenho milhares de arquivos semelhantes e gostaria de escrever seus respectivos nomes depois de um padrão dentro deles. Por exemplo:
** o nome do arquivo 1 é nexus0000
dentro do arquivo existe:
>Pseudomonas_1M
ATGATCCGCTTCGAGCAGGTCGGCAAACGCTATC
>Pseudomonas_2M
GTGAGCTTCGAGCAGGTCGGCGAGCCGCTATC
e eu quero conseguir isso:
nexus0000>Pseudomonas_1M
ATGATCCGCTTCGAGCAGGTCGGCAAACGCTATC
nexus0000>Pseudomonas_2M
GTGAGCTTCGAGCAGGTCGGCGAGCCGCTATC
** o nome do arquivo 2 é nexus0001
dentro do arquivo existe:
>Pseudomonas_1M
ATGATCCGCTTCGAGCAGGTCGGCAAACGCTATC
>Pseudomonas_2M
GTGAGCTTCGAGCAGGTCGGCGAGCCGCTATC
e eu quero conseguir isso:
nexus0001>Pseudomonas_1M
ATGATCCGCTTCGAGCAGGTCGGCAAACGCTATC
nexus0001>Pseudomonas_2M
GTGAGCTTCGAGCAGGTCGGCGAGCCGCTATC
etc.
Até agora, só consegui escrever o nome do arquivo na primeira linha usando:
for file in nexus*; do echo "$file"$"$(cat -- "$file")" > "$file"; done
Obrigado pela ajuda!
find . ! -name . -prune -type f -name nexus\* -exec perl -i'' -pe 's/^>/$ARGV>/' {} +
Lançamos um find
apenas para o diretório atual, procurando por arquivos regulares, nomes começando com nexus
e, em seguida, realizando uma edição no local de vários desses arquivos, substituindo o >
encontrado no início da linha com filename + próprio.
Isso pode ser feito facilmente com o perl one-liner da seguinte forma:
perl -i -pe 's/>/$ARGV$_/g' nexus*
Observe que -i
altera o arquivo no local, portanto, se você quiser testar apenas o comando, execute-o sem -i
flag primeiro.
Tags bash linux bioinformatics