我有一个包含数百万行的csv文件。现在很少有行包含更多数据,然后列数据类型可以容纳。对于例如csv文件只有两行,如下图所示,请不要^ _是分隔符
A^_B^_C
AA^_BB^_CC
现在假设每一行只能容纳一个字符,所以第1行第1行是正确的,但第2行不是,我想找出所有这些行。
所以我想如果我从csv文件获得最长的行我会很好并且我试图关注但没有帮助(来自longest line)
wc -L file
请帮我找到csv文件中最大的行/列。另一个问题是我有两个分隔符,因此也无法使用cut命令。
答案 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;并被编入索引以便更容易找到它。