Bash
確定簡化 csv 文件中每一列的最大列長度(每行一行)
為了確定逗號分隔的 csv 文件中每一列的最大長度,我將一個 bash 腳本組合在一起。當我在 linux 系統上執行它時,它產生了正確的輸出,但我需要它在 OS X 上執行,它依賴於
wc
可以與參數-L
for一起使用的 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 可能是一個解決方案,但這不是我想要採取的路徑,因為我確信它可以在不修改系統的情況下解決。
為什麼不使用 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
類似於弓箭手,但減少了
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