Determina o comprimento máximo da coluna para cada coluna em um arquivo csv simplificado (uma linha por linha)

3

Para determinar o comprimento máximo de cada coluna em um arquivo csv separado por vírgula, eu criei um script básico. Quando o executei em um sistema linux, ele produziu a saída correta, mas eu preciso que ele seja executado no OS X e se baseie na versão GNU de wc que pode ser usada com o parâmetro -L for --max-line-length .

A versão de wc no OSX não suporta essa opção específica e estou procurando uma alternativa.

Meu script (que não é tão bom - reflete minhas habilidades de script ruins, eu acho):

#!/bin/bash

for((i=1;i< 'head -1 $1|awk '{print NF}' FS=,'+1 ;i++));
    do echo  | xargs echo -n "Column$i: " && 
    cut -d, -f $i $1 |wc -L  ; done

Quais impressões:

Column1: 6
Column2: 7
Column3: 4
Column4: 4
Column5: 3

Para meu arquivo de teste:

123,eeeee,2323,tyty,3
154523,eegfeee,23,yty,343

Eu sei que instalar o GNU CoreUtils através do Homebrew pode ser uma solução, mas esse não é um caminho que eu quero seguir, já que tenho certeza de que ele pode ser resolvido sem modificar o sistema.

    
por jpw 04.09.2014 / 09:55

3 respostas

7

por que não usar o awk?

Eu não tenho um mac para testar, mas o length () é uma função bastante padrão no awk, então isso deve funcionar.

arquivo awk:

 { for (i=1;i<=NF;i++) {
    l=length($i) ;
    if ( l > linesize[i] ) linesize[i]=l ;
  }
}
END {
    for (l in linesize) printf "Columen%d: %d\n",l,linesize[l] ;
}

execute

mybox$ awk -F, -f test.awk  a.txt
Columen4: 4
Columen5: 3
Columen1: 6
Columen2: 7
Columen3: 4
    
por 04.09.2014 / 10:09
4

Semelhante a archemars mas reduzido

awk -F, ' { for (i=1;i<=NF;i++)l[i]=((x=length($i))>l[i]?x:l[i])}
          END {for (i in l) print "Column"i":",l[i]}' file

Column4: 4
Column5: 3
Column1: 6
Column2: 7
Column3: 4

Também para manter o pedido

 awk -F, ' { for (i=1;i<=NF;i++)l[i]=((x=length($i))>l[i]?x:l[i])}
           END {for(i=1;i<=NF;i++) print "Column"i":",l[i]}'

Column1: 6
Column2: 7
Column3: 4
Column4: 4
Column5: 3
    
por 04.09.2014 / 11:51
1

Uma solução perl :

$ perl -F, -anle 'map {$h{$_} = length($F[$_]) if length($F[$_]) > $h{$_}} 0..$#F;
    END { print "Column @{[$_+1]}: $h{$_}" for sort {$a <=> $b} keys %h }' file
Column 1: 6
Column 2: 7
Column 3: 4
Column 4: 4
Column 5: 3
    
por 04.09.2014 / 10:50