쉼표로 구분된 CSV 파일에서 각 열의 최대 길이를 결정하기 위해 bash 스크립트를 작성했습니다. Linux 시스템에서 실행하면 올바른 출력이 생성되지만 OS X에서 실행하려면 wc
인수 가 필요한 -L
GNU 버전 에 의존합니다 --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
비자동 인쇄 라인별 명령줄 플래그를 사용합니다.
- 해시는 BEGIN 블록에서 선언됩니다(사용에 유의하세요
my
). Raku에서는 각인이 불변이므로%
나중에 코드에서 동일한 각인을 볼 수 있습니다. - 루프 본문 내에서 각 줄을 읽고 쉼표로 구분하여 배열에 할당합니다
@F
(다시 말하지만@
-sigil은 변경되지 않음). 배열을 0map
에서0..^@F.elems
1로 빼고 각 위치의 문자 수에 해시를 할당/업데이트합니다.elems
max
- 모든 라인을 읽은 후 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