Reformatar colunas CSV com SED (ou qualquer outro coreutil)

6

Dado o seguinte segmento criado a partir de um arquivo de saída de hashdeep:

7241,11111111111111111111111111111111,-data\file1
1237241,22222222222222222222222222222222,-data\file2
41,33333333333333333333333333333333,-data\file3

Como eu conseguiria formatá-lo assim:

   7241,11111111111111111111111111111111,-data\file1
1237241,22222222222222222222222222222222,-data\file2
     41,33333333333333333333333333333333,-data\file3

Eu gostaria de usar o sed (como é isso que eu estou começando a entender), mas existe uma maneira de dizer ao sed para mudar apenas os caracteres se eles ocorrerem em uma coluna específica ou em colunas específicas?

Claro que se houver outra maneira de fazer isso, ficarei feliz em saber disso.

A razão para isso é que eu quero classificar a saída nos nomes dos arquivos, para que eu possa comparar dois arquivos de saída, sem ter que usar a opção -j0 (single-thread) no hashdeep.

    
por Robert Prins 06.01.2016 / 08:19

4 respostas

8

com awk :

awk -v l="$(wc -L <file)" '{printf "%"l"s\n", $0}' file
  • -v atribui um valor externo a uma awk variable l .
    • wc -L <file encontra o comprimento da linha mais longa no arquivo.
  • printf "%"l"s\n", $0 imprime cada espaço de linha preenchido com l espaços. Para 10 espaços, seria, por exemplo, semelhante a: printf "%10s\n", $0 .

A saída:

   7241,11111111111111111111111111111111,-data\file1
1237241,22222222222222222222222222222222,-data\file2
     41,33333333333333333333333333333333,-data\file3
    
por 06.01.2016 / 08:38
6
sed -e:, -e's/^[^,]\{0,6\},/ &/;t,'

Apenas faz um pequeno loop até que haja pelo menos 7 não-vírgulas na frente de uma linha. Ele só faz qualquer coisa, no entanto, se houver menos de 7 não-vírgulas, que são imediatamente seguidas por uma vírgula. E isso não afeta as linhas ou linhas em branco que não correspondem a uma vírgula, ou aquelas que o fazem, mas que já começam com 7 ou mais não-vírgulas.

O loop também é muito barato - o autômato só precisa considerar dois tipos de caracteres - aqueles que são ou não são vírgulas - e apenas 7 deles no máximo em um determinado momento.

   7241,11111111111111111111111111111111,-data\file1
1237241,22222222222222222222222222222222,-data\file2
     41,33333333333333333333333333333333,-data\file3
    
por 06.01.2016 / 09:15
0

Não usando sed . Copiei sua entrada e colei no Libreofffice Calc, selecionei a opção "separado por vírgula" em "Colar especial" e coloquei cada tipo de dados em colunas separadas, conforme mostrado abaixo.

Solução muito simples, eu acho.

7241    11111111111111100000000000000000    -data\file1 

1237241 22222222222222200000000000000000    -data\file2

41      33333333333333300000000000000000    -data\file3
    
por 06.01.2016 / 19:11
0

Eu não entendi muito bem a questão, mas acho que você só quer classificar por nome de arquivo? Nesse caso, use apenas sort :

sort -t , -k 3 my_file.txt
    
por 06.01.2016 / 22:37