检查文件中的行是否具有相同的列数

时间:2015-10-10 04:51:13

标签: bash tsv

我有很多tsv文件,我想检查每个文件是否格式正确。主要是,我想检查每行是否有正确的列数。有没有办法做到这一点?如果有的话,我会喜欢命令行解决方案。

4 个答案:

答案 0 :(得分:3)

在这里添加这个,因为这些答案都很接近,但对我来说并不合适,在我的情况下,我需要为awk指定字段分隔符。

以下内容应返回一行,其中包含列数(如果每行具有相同的列数)。

$ awk -F'\t' '{print NF}' test.tsv | sort -nu 
8
  • -F用于指定awk的字段分隔符
  • NF是字段数
  • -nu以数字方式命令每行的字段数,并仅返回唯一的

如果您返回多行,则.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解析器。