使用shell脚本

时间:2016-02-14 04:33:22

标签: shell csv awk sh gawk

我有几个包含多列的CSV文件,我想获取同一CSV文件中每列的最大长度,最小长度和diff(max -min)。例如:

文件:

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 Length脚本存在问题:

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 个答案:

答案 0 :(得分:3)

您只需根据文件的第一行设置最小和最大数组的起始值:

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