Shell 如何在linux中查找csv文件中最长的列(因此是行)?
我有一个包含数百万行的csv文件。现在很少有行包含比列数据类型所能容纳的数据更多的数据。例如,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 ' {
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;iawk-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发布他的预期输出,我们都只是猜测。没错,但我讨厌你总是做出最好的猜测!;)
这还有待观察。。。取决于最大行/列的含义:最长字段、包含最长字段的行、最长行、包含最长字段的字段编号中的所有字段,或完全不同的内容。