如何在linux中的csv文件中找到最长的列(因此行)?

时间:2014-03-19 17:12:07

标签: shell unix csv awk

我有一个包含数百万行的csv文件。现在很少有行包含更多数据,然后列数据类型可以容纳。对于例如csv文件只有两行,如下图所示,请不要^ _是分隔符

A^_B^_C
AA^_BB^_CC

现在假设每一行只能容纳一个字符,所以第1行第1行是正确的,但第2行不是,我想找出所有这些行。

所以我想如果我从csv文件获得最长的行我会很好并且我试图关注但没有帮助(来自longest line

wc -L file

请帮我找到csv文件中最大的行/列。另一个问题是我有两个分隔符,因此也无法使用cut命令。

3 个答案:

答案 0 :(得分:3)

您可以尝试以下内容:

awk '
{
for(i=1;i<=NF;i++) 
    if (length($i) == good) { continue } 
    else {
        print "Row "NR" contained data more than " good" in a single field"
        next
    }
    print "Row "NR " is valid"
}' FS='\\^_' good="1" csv
Row 1 is valid
Row 2 contained data more than 1 in a single field

<强>解释

  • 我们将字段分隔符设置为\\^_(注意我们需要转义^因为它是一个特殊字符)。
  • 我们遍历每个字段
  • 我们使用在运行时传递的变量(good)检查字段的长度。
  • 如果字段是好的,我们继续循环到下一个字段并继续这样做直到该行的最后一个字段。
  • 如果任何字段的大小超过good,我们会使用NR打印包含行号的邮件。
  • 如果所有字段都很好,那么我们打印消息说明行是好的。

如果我误解了你的问题,请随时发表评论。

答案 1 :(得分:2)

awk -F'\\^_' -v OFS=':' '
{
    for (i=1;i<=NF;i++) {
        if (length($i) > max) {
            max = length($i)
            lineNr = NR
            line   = $0
            fldNr  =  i
            fld    = $i
        }
    }
}
END {
    print lineNr, line
    print fldNr, fld
}
' file

答案 2 :(得分:0)

这里的答案需要使用与数据相同的分隔符在单行文件中定义列长度(假设不同的列可以具有不同的可接受长度):

1^_1^_1

使用该文件(我称之为clengths)并以懒惰的方式使用split()来获取索引元素:

awk -F'\\^_' '

  NR==FNR {split($0,clen,FS); next} # store the lengths

  {
    split($0,a,FS); # put the current line in an array
    for( i in a )
    { if( length(a[i]) > clen[i] ) print "["FNR","i"] = "a[i] }
  }
' clengths data

[row, col]开始,将长数据的数组样式索引输出为[line #, field #]又名[1,1]

 [2,1] = AA
 [2,2] = BB
 [2,3] = CC

输出中的所有内容都是&#34;太大&#34;并被编入索引以便更容易找到它。