确定简化的 csv 文件中每一列的最大列长度(每行一行)

jpw*_*jpw 5 bash shell-script text-processing csv-simple

为了确定逗号分隔的 csv 文件中每列的最大长度,我编写了一个 bash 脚本。当我跑了它在Linux系统上它产生正确的输出,但我需要它在OS X上运行,它依赖于GNU版本的wc可与参数一起使用-L--max-line-length

wcOSX 上的版本不支持该特定选项,我正在寻找替代方案。

我的脚本(不太好 - 我猜这反映了我糟糕的脚本技能):

#!/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
Run Code Online (Sandbox Code Playgroud)

哪个打印:

Column1: 6
Column2: 7
Column3: 4
Column4: 4
Column5: 3
Run Code Online (Sandbox Code Playgroud)

对于我的测试文件:

123,eeeee,2323,tyty,3
154523,eegfeee,23,yty,343
Run Code Online (Sandbox Code Playgroud)

我知道通过 Homebrew 安装 GNU CoreUtils 可能是一个解决方案,但这不是我想要的路径,因为我确信它可以在不修改系统的情况下解决。

Arc*_*mar 8

为什么不使用 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] ;
}
Run Code Online (Sandbox Code Playgroud)

然后运行

mybox$ awk -F, -f test.awk  a.txt
Columen4: 4
Columen5: 3
Columen1: 6
Columen2: 7
Columen3: 4
Run Code Online (Sandbox Code Playgroud)


小智 6

与archemers相似,但减少了

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
Run Code Online (Sandbox Code Playgroud)

还要维持秩序

 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
Run Code Online (Sandbox Code Playgroud)