Bash

確定簡化 csv 文件中每一列的最大列長度(每行一行)

  • February 11, 2015

為了確定逗號分隔的 csv 文件中每一列的最大長度,我將一個 bash 腳本組合在一起。當我在 linux 系統上執行它時,它產生了正確的輸出,但我需要它在 OS X 上執行,它依賴於wc可以與參數-Lfor一起使用的 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

引用自:https://unix.stackexchange.com/questions/153697