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 可能是一个解决方案,但这不是我想要的路径,因为我确信它可以在不修改系统的情况下解决。
为什么不使用 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)