unix - 文件中每列的最大值(长度)

too*_*oop 4 unix linux bash shell awk

给定一个包含这样数据的文件(即stores.dat文件)

sid|storeNo|latitude|longitude
2tt|1|-28.0372000t0|153.42921670
9|2t|-33tt.85t09t0000|15t1.03274200
Run Code Online (Sandbox Code Playgroud)

期望的输出:

sid : 3
storeNo : 2
latitude : 16
longitude : 13
Run Code Online (Sandbox Code Playgroud)

返回每列下值的最大长度的语法是什么?

我试过这个,但它不起作用:

nawk 'BEGIN { FS = "|" }
{
for(n = 1; n <= NF; n++) {
if (length($n) > max)
max = length($n)
maxlen[$n] = max
}
}
END {
for (i in maxlen) print "col " i ": " maxlen[i]
} ' stores.dat
Run Code Online (Sandbox Code Playgroud)

更新(感谢Mat的回答 - 我已经解决了这个问题):

awk -F"|" '  NR==1{
    for(n = 1; n <= NF; n++) {
       colname[n]=$n
    }
}
NR>1{
    for(n = 1; n <= NF; n++) {
        if (length($n)>maxlen[n])
            maxlen[n]=length($n)
    }
}
END {
        for (i in colname) {
                print colname[i], ":", maxlen[i]+0;
        }
} ' filename
Run Code Online (Sandbox Code Playgroud)

Mat*_*Mat 6

您的脚本存在一些问题 - max在列之间共享,而您根本不处理标题行.请尝试以下方法:

$ cat t.awk 
#!/bin/awk -f
NR==1{
    for(n = 1; n <= NF; n++) {
       colname[n]=$n
    }
}
NR>1{
    for(n = 1; n <= NF; n++) {
        if (length($n)>maxlen[n])
            maxlen[n]=length($n)
    }
}
END {
        for (i in maxlen) {
                print colname[i], ":", maxlen[i];
        }
}
$ awk -F'|' -f t.awk stores.dat
Run Code Online (Sandbox Code Playgroud)

$n指的是n第th列的内容.n是列号(在第一个和第二个循环中).最后一个循环只显示了迭代数组的方法awk.