验证csv在Bash中是否具有逗号分隔值

llmtgqce  于 2023-01-06  发布在  其他
关注(0)|答案(3)|浏览(134)

您好,我有以下csv文件:

  • file1.csv:
1,2,3
asjkhfajsdkfasdj,2,iasuhdsg;ghasdgjklh
<>A<SF@!*AFSL<,ahsodgasdklgjaskd2152351235,12
hello,world,!

我想验证上述csv文件是否具有以下结构(3个值(任意字符),用2个逗号分隔):

value1,value2,value3

而不是以下任何模式:

value1
value1,
value1,value2
value1,value2,
value1,value2,value3,
value1,value2,value3,value4

我尝试使用此命令(see link here):

CSVcnt=`awk 'BEGIN{FS=","}END{print NF}' $csv_file`
echo "CSVcnt = $CSVcnt"

上述命令将返回正确的3。
但让我们使用以下内容来考虑以下场景:

  • file2.csv
1,2,3,4,5,6,7,8,9,10
1,2,3
1,2,3
1,2,3

将返回3,这是***不正确的***

  • file3.csv
1,2,3
1,2,3
1,2,3
1,2,3,4,5,6,7,8,9,10

将返回10,这是***正确的***

  • file4.csv
1,2,3
1,2,3
1,2,3,4,5,6,7,8,9,10
1,2,3,4

将返回4,这是***不正确的***
所以,看起来我使用的awk命令只基于最后一行。您能建议一下是否有一种方法可以使用awk命令返回整个文件中找到的最大数量吗?请注意,我不喜欢使用REGEX,如果可能的话,我也不喜欢使用for循环。(每个csv将有10K到40K行)

0s0u357o

0s0u357o1#

如果你只想得到NF,那么你可以这样做:

awk -F ',' 'NF > maxNF {maxNF = NF} END {print maxNF+0}' file.csv
34gzjxbg

34gzjxbg2#

如果你想计算田地的数量

awk -F, '{a[NF]++} END {for (e in a) {print e ":" a[e]}}' file.csv

产生了类似于

3:2
4:1
10:1

以你为例

1,2,3
1,2,3
1,2,3,4,5,6,7,8,9,10
1,2,3,4
0yycz8jy

0yycz8jy3#

如果你不担心带引号的字段(它可以包含换行符和不是字段分隔符的文本逗号),也许可以尝试两遍解决方案。

awk -F, 'BEGIN { OFS=":" }
  NR==FNR { ++n[NF]; next }
  FNR == 1 { for(k in n) if (n[k] > m) { m=n[k]; f=k } }
  NF != k { print FILENAME, FNR, $0 }' file.csv file.csv

以打印具有与“正常”数目不同数目的字段的所有行(通过建立对于文件中的最大数目的行为真的计数来简单地确定“正常”数目)。
如果还想打印最后一个字段为空的行,可以添加

(!$NF) ||

在最后一个条件之前。
单独在Awk中很难找到合适的解决方案,但使用Python则相当简单;标准库中的csv模块处理CSV的几种方言,并正确处理引用字段等。

相关问题