给定一个包含这样数据的文件(即 stores.dat 文件)
sid|storeNo|latitude|longitude
2tt|1|-28.0372000t0|153.42921670
9|2t|-33tt.85t09t0000|15t1.03274200
期望的输出:
sid : 3
storeNo : 2
latitude : 16
longitude : 13
返回每列下值的最大长度的语法是什么?
我已经试过了,但它不起作用:
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
更新(感谢 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
最佳答案
您的脚本存在一些问题 - 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
$n
指的是第n
列的内容。 n
是列号(在第一个和第二个循环中)。最后一个循环只是展示了一种在 awk
中迭代数组的方法。
关于linux - unix - 文件中每列的最大(长度),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8629973/