我有一个包含20个字段的csv文件。我希望有一个脚本来检查文件是否有效,具体如下:
例如:
f1|f2|f3|...|f20
1|aaaa|Y|...|2014/06/25
2|bb|Y...|2014/06/25
3|ccc|N...|2014/06/25
regex:
f1 [0-9]
f2 [a-z]{2,4}
f3 [YN]
.
.
.
f20 [1-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]
最好的shell工具是什么?你有类似的剧本吗?
答案 0 :(得分:3)
Unix系统中的最佳工具是awk
这项工作。您可以使用这样的awk命令:
awk 'BEGIN{FS=OFS="|"} NF!=20{print "not enough fields"; exit}
!($1~/^[0-9]$/) {print "1st field invalid"; exit}' file.csv
答案 1 :(得分:2)
您可能需要考虑使用perl脚本:
#!/usr/bin/env perl
use strict;
use warnings;
my @regexes = (
qr/\d/, # regex quotes qr/ /
qr/[a-z]{2,4}/,
qr/[YN]/,
#etc. put the rest of the regexes here
);
while (<>) { # loop through every line of file
my @fields = split /\|/; # split on pipe, needs escaping
if (@fields != 20) {
print "incorrect number of fields on line $.\n";
exit;
}
for my $f (0..$#fields) { # loop through all fields
unless ($fields[$f] =~ $regexes[$f]) { # regex match
print "invalid field on line $., field ", ($f+1), "\n";
exit;
}
}
}
如果您将脚本保存为valid.pl
并使其可执行chmod +x valid.pl
,则可以将其称为./valid.pl filename
。目前,遇到第一个问题时,脚本将立即退出。如果删除exit
语句,它将列出文件的所有问题。
如果您不熟悉perl,$.
是一个特殊变量,其中包含while
循环中的行号。 $#fields
是数组@fields
的最后一个索引的值,因此0..$#fields
等同于列表0,1,...,19。数组索引从0开始,所以我在字段编号中添加了1。