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

标签 linux bash shell unix awk

给定一个包含这样数据的文件(即 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/

相关文章:

linux - BASH脚本在需要按键返回提示时调用新脚本

android - 如何向android发送命令然后得到它的答案?

C++11 成员初始化列表歧义

linux - 如何使用 CGI 和 Perl 的 Net::OpenSSH 模块在远程 Linux 服务器上执行系统命令?

bash - 如何在 shell 脚本中调用 ioctl?

regex - 使用 sed/regex 进行 bash 字符串操作

shell - Cron Bad Minute 错误 : "home.cron":0: bad minute crontab: errors in crontab file, 无法安装

linux - 与 linux shell 有关的参数和选项之间的区别

linux - 如何在linux中使用我自己的动态库(Makefile)

c++ - 一线程读一线程写,std::deque安全吗?