Extrai partes do nome do arquivo csv em colunas

3

Eu tenho um conjunto de arquivos .csv em um diretório, digamos

abc_q1_w1.csv
defg_q11_w2.csv
hijk_q11_w3.csv 

Eu quero escrever um script que extraia partes do nome do arquivo e as coloque em colunas, ou seja,

abc     q1      w1
defg    q11     w2
hijk    q11     w3

Alguém sabe como esse tipo de extração de nome de arquivo pode ser conseguido usando um script bash?

    
por zsha 05.07.2016 / 10:43

2 respostas

1

Usando sed

$ printf "%s\n" * | sed 's/.csv$//; s/_/\t/g'
abc     q1      w1
defg    q11     w2
hijk    q11     w3

Como funciona:

  • printf "%s\n" * imprime os nomes dos arquivos um por linha

  • s/.csv$// remove o .csv .

  • s/_/\t/g converte _ em guias.

Usando o bash

$ for f in *; do f="${f%.csv}"; printf "%s\n" "${f//_/$'\t'}";  done
abc     q1      w1
defg    q11     w2
hijk    q11     w3

Se ajudar com clareza, o código acima pode ser dividido em várias linhas:

for f in *
do
    f="${f%.csv}"
    printf "%s\n" "${f//_/$'\t'}"
done

${f%.csv} remove os .csv e ${f//_/$'\t'} restantes convertem todos os _ em guias.

Não usamos echo para essa tarefa porque, se um dos nomes de arquivo começar com - , muitos shells tentariam interpretar esse nome de arquivo como uma opção e o resultado não seria bom.

Executando o código de um diretório diferente

$ for f in "$dir"/*; do f="${f#$dir/}"; f="${f%.csv}"; printf "%s\n" "${f//_/$'\t'}";  done
abc     q1      w1
defg    q11     w2
hijk    q11     w3
    
por 05.07.2016 / 10:58
2

Você poderia usar algo como:

ls -1 | tr '_' '\t'
    
por 05.07.2016 / 10:55