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

Shell 如何在linux中查找csv文件中最长的列(因此是行)?,shell,unix,csv,awk,Shell,Unix,Csv,Awk,我有一个包含数百万行的csv文件。现在很少有行包含比列数据类型所能容纳的数据更多的数据。例如,csv文件只有两行,如下所示,请不要使用^作为分隔符 A^_B^_C AA^_BB^_CC 现在假设每行只能容纳一个字符,所以第1行第1行是正确的,但第2行不是,我想找出所有这些类型的行 所以我想如果我从csv文件中获得最长的行,我会很好,我试着跟随,但没有帮助(来自) 请帮助我查找csv文件中最大的行/列。另一个问题是我有两个分隔符,所以不能同时使用cut命令 您可以尝试以下方法: awk ' {

我有一个包含数百万行的csv文件。现在很少有行包含比列数据类型所能容纳的数据更多的数据。例如,csv文件只有两行,如下所示,请不要使用^作为分隔符

A^_B^_C
AA^_BB^_CC
现在假设每行只能容纳一个字符,所以第1行第1行是正确的,但第2行不是,我想找出所有这些类型的行

所以我想如果我从csv文件中获得最长的行,我会很好,我试着跟随,但没有帮助(来自)


请帮助我查找csv文件中最大的行/列。另一个问题是我有两个分隔符,所以不能同时使用cut命令

您可以尝试以下方法:

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
awk'
{

对于(i=1;i您可以尝试以下方法:

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
awk'
{
对于(i=1;i
awk-F'\\^'-v OFS=':''
{
对于(i=1;i最大值){
最大值=长度($i)
lineNr=NR
行=$0
fldNr=i
fld=一美元
}
}
}
结束{
打印行号
打印fldNr,fld
}
"档案"
awk-F'\\^'-v OFS=':''
{
对于(i=1;i最大值){
最大值=长度($i)
lineNr=NR
行=$0
fldNr=i
fld=一美元
}
}
}
结束{
打印行号
打印fldNr,fld
}
"档案"

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

使用该文件(我称之为
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]
aka
[line#,field#]
[1,1]
开始:

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

输出中的所有内容都“太大”,并且都编制了索引以便于再次查找。

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

使用该文件(我称之为
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]
aka
[line#,field#]
[1,1]
开始:

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


输出中的所有内容都“太大”和被索引以使查找更容易。

您有哪两个定界符?我只在示例数据中看到
。嗨@jaypal请查看带定界符的编辑问题。您有哪两个定界符?我只在示例数据中看到
。嗨@jaypal请查看带定界符的编辑问题。嗨,非常感谢您的回答。为了简单起见我说每个列只有一个长度,但长度是可变的。我不知道所有列的长度。我只希望最长的列应该在我的输出中可见,或者有罪犯的最长行。如果你不知道要比较的长度,你如何定义最长的列?如果我可以接受的长度是10,我将报告11、1000、40000和lo你可以只做
awk'{print“Row”NR“是”length($0)“characters”}“FS=”\\^\'csv
打印每行的长度。+1对于一个定义不太明确的问题,这是一个非常好的答案。您好,非常感谢您的回答。为了简单起见,我说每列只有一个长度,但长度是可变的。我不知道所有列的长度。我只希望最长的列应该在我的输出中可见,或者使用cu显示最长的行lprits。如果您不知道要比较的长度,如何定义最长的列?如果我可以接受的长度是10,我将报告11、1000、40000和最长的。您只需执行
awk'{print“Row”NR“length($0)”characters}“FS=”\\^\'csv
打印每行的长度。+1这对于一个定义不太明确的问题来说是一个很好的答案。+1:现在我看到了你的答案,问题变得更清楚了。讽刺的是,不是吗?
:P
没有OP发布他的预期输出,我们都只是猜测。没错,但我讨厌你总是做出最好的结果猜猜看
还有待观察……这取决于
最大的行/列
是什么意思:最长的字段、包含最长字段的行、最长的行、包含最长字段的字段编号中的所有字段,或者完全不同的内容。+1:现在我看到了你的答案,问题变得更清楚了。讽刺的是,不是它?
:P
没有OP发布他的预期输出,我们都只是猜测。没错,但我讨厌你总是做出最好的猜测!
;)
这还有待观察。。。取决于最大行/列的含义:最长字段、包含最长字段的行、最长行、包含最长字段的字段编号中的所有字段,或完全不同的内容。