2016-02-14 232 views
0

我有幾個CSV文件有多個列,我想要獲取每個列的最大長度,最小長度和每個列的最大長度(最大 - 最小值)列在同一個CSV文件中。例如:使用shell腳本查找CSV文件中列的最小和最大長度

文件:

abc 1234 4 
bcd 23644 534 
c 3232 6 

預期輸出:

abc 1234 4 
    bcd 23644 534 
    c 3232 6 

Max Length 3 5 3 
Min Length 1 4 1 
Diff 2 1 2 

下面的腳本用於計算MAX柱長度產生預期輸出:

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]} ' 

但有MIN長度腳本的問題:

awk -F"," 'BEGIN { 
    for (i=1;i<=NF;i++) { 
     cur = length($i) 
     if ((min == 0) || (cur < min)) { 
      minlength = i 
      min = cur 
     } 
    } ; 
for (i=1;i<=NF;i++) print $minlength}' 

任何幫助將不勝感激。

+1

中,第二腳本,使用BEGIN,你需要閱讀了關於節目BEGIN做了什麼。另外,您提到了CSV文件,awk腳本使用逗號作爲分隔符,但您的示例中沒有逗號。由於「CSV」無論如何都是高度模糊的名稱,如果您澄清了您的意思,它可能會有所幫助。特別是,任何領域都有嵌入字段分隔符?如果CSV文件中的某個字段中的值看起來像「」abc「'(即帶有外部引號),那麼應計算爲長度爲3還是5?那麼''「」「'的長度呢? – peak

回答

3

你只需要設置爲最小和基於文件的第一行Max陣列初始值:

awk ' 
    NR==1 {for (i=1; i<=NF; i++) maxlen[i] = minlen[i] = length($i)} 
    { 
     for (i=1; i<=NF; i++) { 
      len = length($i) 
      if (len > maxlen[i]) maxlen[i] = len 
      if (len < minlen[i]) minlen[i] = len 
     } 
    } 
    END { 
     printf "Max Length" 
     for (i=1; i<=NF; i++) printf " %d", maxlen[i] 
     print "" 
     printf "Min Length" 
     for (i=1; i<=NF; i++) printf " %d", minlen[i] 
     print "" 
     printf "Diff" 
     for (i=1; i<=NF; i++) printf " %d", maxlen[i]-minlen[i] 
     print "" 
    } 
' file 
+0

不要使用'l'(字母'el')作爲變量名,因爲它看起來太像'1'(數字'1'),在一些字體中難以區分,因此混淆了您的腳本。例如,'maxl [i] = l'看起來像是將'maxl [i]'設置爲'1'。也許使用'cur'來匹配'max'和'min'? –

相關問題