단순화된 csv 파일의 각 열에 대한 최대 열 길이 결정(행당 한 행)

단순화된 csv 파일의 각 열에 대한 최대 열 길이 결정(행당 한 행)

쉼표로 구분된 CSV 파일에서 각 열의 최대 길이를 결정하기 위해 bash 스크립트를 작성했습니다. Linux 시스템에서 실행하면 올바른 출력이 생성되지만 OS X에서 실행하려면 wc인수 가 필요한 -LGNU 버전 에 의존합니다 --max-line-length.

OSX 버전은 wc특정 옵션을 지원하지 않으며 대안을 찾고 있습니다.

내 스크립트(그렇게 좋지는 않습니다. 내 스크립트 기술이 좋지 않음을 반영하는 것 같습니다):

#!/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

다음을 인쇄합니다.

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

내 테스트 파일의 경우:

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

Homebrew를 통해 GNU CoreUtils를 설치하는 것이 해결책일 수 있다는 것을 알고 있지만 시스템을 수정하지 않고도 해결할 수 있다고 확신하기 때문에 이는 제가 취하고 싶은 경로가 아닙니다.

답변1

왜 awk를 사용하지 않습니까?

테스트할 Mac은 없지만 length()는 awk의 표준 함수이므로 작동할 것입니다.

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] ;
}

그런 다음 실행

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

답변2

Archemars와 유사하지만 감소됨

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

또한 질서를 유지하기 위해

 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

답변3

일방 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

답변4

사용행복하다(이전 Perl_6)

~$ raku -ne 'BEGIN my %h; 
               my @F = $_.split(","); 
               map { %h{$_} = chars(@F[$_]) max %h{$_} }, 0..^@F.elems; 
             END put "Column" ~ $_.key + 1 ~ ": " ~ $_.value for %h.sort: +*.key;'  file  

Raku는 Perl 프로그래밍 언어 제품군에 속하며 유니코드에 대한 고급 지원을 제공하므로 문자 수가 정확합니다. 이것은 @cuonglm이 Perl 코드를 Raku로 훌륭하게 번역한 것입니다.

먼저 (awk와 유사한) -ne비자동 인쇄 라인별 명령줄 플래그를 사용합니다.

  1. 해시는 BEGIN 블록에서 선언됩니다(사용에 유의하세요 my). Raku에서는 각인이 불변이므로 %나중에 코드에서 동일한 각인을 볼 수 있습니다.
  2. 루프 본문 내에서 각 줄을 읽고 쉼표로 구분하여 배열에 할당합니다 @F(다시 말하지만 @-sigil은 변경되지 않음). 배열을 0 map에서 0..^@F.elems1로 빼고 각 위치의 문자 수에 해시를 할당/업데이트합니다.elemsmax
  3. 모든 라인을 읽은 후 END 블록이 실행됩니다. sort열과 문자 수를 해시하고 출력합니다 . 기본 정렬은 키에 대한 문자열 정렬이므로 numify를 사용합니다. 또한 Raku의 문자열 연결은 물결표를 사용하여 수행됩니다(쉼표도 작동하지만 여기서는 설명을 위해 물결표를 사용함).$_.key + 1$_.value+~

입력 예:

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

예제 출력:

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

https://docs.raku.org
https://raku.org

관련 정보