我有很多tsv文件,我想检查每个文件是否格式正确。主要是,我想检查每行是否有正确的列数。有没有办法做到这一点?如果有的话,我会喜欢命令行解决方案。
答案 0 :(得分:3)
在这里添加这个,因为这些答案都很接近,但对我来说并不合适,在我的情况下,我需要为awk指定字段分隔符。
以下内容应返回一行,其中包含列数(如果每行具有相同的列数)。
$ awk -F'\t' '{print NF}' test.tsv | sort -nu
8
如果您返回多行,则.tsv中有一些行的列数多于其他行。
要检查.tsv是否正确格式化,每行具有相同数量的字段,以下应返回1(由kmace在接受的答案上注释)但是我需要添加-F' \ t& #39;
$ awk -F'\t' '{print NF}' test.tsv | sort -nu | wc -l
答案 1 :(得分:2)
awk '{print NF}' test | sort -nu | head -n 1
这为您提供了任何给定行上文件中的最低列数。
awk '{print NF}' test | sort -nu | tail -n 1
这为您提供了任何给定行上文件中最高的列数。 如果所有列都存在,结果应该相同。
注意:这在OS X上给出了一个错误,但在Debian上没有错误...也许使用gawk
。
答案 2 :(得分:1)
(我假设通过" tsv",你的意思是一个文件,其列用制表符分隔。)
只要文件没有包含制表符的引用字段,您就可以使用awk完成此操作。
如果您知道预期的列数,则以下内容将起作用:
awk -F '\t' -v NCOLS=42 'NF!=NCOLS{printf "Wrong number of columns at line %d\n", NR}'
(当然,您需要将42
更改为正确的值。)
您还可以自动从第一行获取列数:
awk -F '\t' 'NR==1{NCOLS=NF};NF!=NCOLS{printf "Wrong number of columns at line %d\n", NR}'
如果第一行的列数错误,那将会起作用(有很多噪音)但是它无法检测到 all 这些行具有相同错误列数的文件。因此,您可能最好使用第一个版本,这会强制您指定列数。
答案 3 :(得分:0)
++
是一个很好的候选人。如果您的列由制表符分隔(我猜这是awk
的意思),如果您知道它们应该有多少,例如17,您可以尝试:
tsv
这将打印awk -F'\t' 'NF != 17 {print}' file.tsv
中没有完全以制表符分隔的17列的所有行。如果我的猜测不正确,请编辑您的问题并添加缺少的信息(列分隔符,列数...)请注意,file.tsv
(和tsv
)格式比看起来更棘手。这些字段可以包含字段分隔符,记录可以跨越多行...如果是这种情况,请不要尝试重新发明轮子并使用现有的csv
解析器。