Escreva o nome do arquivo antes de um padrão dentro daquele arquivo

3

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!

    
por Manuel 30.06.2017 / 21:21

3 respostas

2

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
    
por 30.06.2017 / 21:33
0
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.

    
por 30.06.2017 / 22:16
0

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.

    
por 30.06.2017 / 23:59