Remove um sufixo específico de todos os arquivos em um diretório

0

Eu tenho um arquivo de genótipo que eu dividi em mais de 2000 arquivos SNPs de 5K usando

split -d geno_file

a saída que recebo é algo assim:

table_subset_0001
table_subset_0002
table_subset_0003
.
.
table_subset_0099
.
.
table_subset_0999

Eu quero excluir 0 e obter

table_subset_1
table_subset_2
table_subset_3
.
.
table_subset_93
.
.
table_subset_999

Existe alguma maneira de fazer isso?

    
por Anna1364 07.08.2017 / 00:01

5 respostas

1

Para adicionar à solução @ John1024, aqui está uma que usa comandos Bash padrão:

for file in table_subset_*; do
    new_name=$(echo "$file" | sed -E -e 's/_0+/_/')
    mv "$file" "$new_name"
done

O princípio é o mesmo. Nós iteramos todos os arquivos e substituímos o _0 por _ .

    
por 07.08.2017 / 00:22
3

Usando o utilitário Perl rename :

rename 's/_0+/_/' table_subset_*

Isso substitui _ seguido por um ou mais caracteres zero com apenas _ .

O acima funciona com o utilitário rename , às vezes chamado de prename , que vem com o Perl. Algumas distribuições instalam o utilitário rename do utilitário util-linux , que é completamente incompatível.

Se a renomeação de Perl ainda não estiver instalada em seu sistema, os métodos para instalá-la podem ser encontrados aqui

    
por 07.08.2017 / 00:11
1

Por uma questão de pureza ...

Uma resposta bash pura: (obrigado @steeldriver)

shopt -s extglob
for file in table_subset_0*; do
    mv "$file" "${file/_+(0)/_}"
done

Uma resposta% GNU sed pura:

ls | sed -n -r '
    /^(table_subset_)0+(.*)/ ! d
    s//mv & /
    e
'

Uma resposta% GNU awk pura:

ls | awk -F '_0+' 'NF > 1 { system("mv " $0 " " $1 "_" $2) }'
    
por 07.08.2017 / 01:50
1

Um simples liner seria (executado na pasta em questão):

rename 's/(?<=table_subset_)([0])+//' ./*

Mas se for executado de fora:

rename 's/(?<=table_subset_)([0])+//' /path/to/files/folder/*
    
por 07.08.2017 / 01:00
0

Você pode usar awk no começo em vez de usar split e executar outra ferramenta rename .

awk 'NR%5000==1{ file=sprintf("table_subset_%d", ((++c)) )} {print >file}' geno_file

isso dividirá o arquivo geno_file nos blocos de arquivos 5K com sufixo numérico sem zeros à esquerda, mas você está à vontade para usar 0Xd in. acima com 4 dígitos de comprimento como sprintf("..._%04d", ((++c)) )

Ou se você gostaria de dividir seu geno_file para apenas 9 partes do arquivo de saída, então primeiro com split e direito usando suas opções para definir iniciar o sufixo numérico de 1 (o padrão é 0) e -a N (gera sufixos de comprimento N (padrão 2)), você pode simplesmente usar da seguinte maneira:

split -a 1 --numeric-suffixes=1 -l TOTALLINES/9HERE table_subset_

Mas ainda não se esqueça de awk solution.

    
por 07.08.2017 / 03:18

Tags