用于验证csv字段的Shell脚本

时间:2014-06-25 21:52:33

标签: regex bash shell unix awk

我有一个包含20个字段的csv文件。我希望有一个脚本来检查文件是否有效,具体如下:

  • 它需要有20个由管道分隔的字段。
  • 20个字段中的每个字段都应与正则表达式匹配。
  • 了解任何正则表达式匹配的行和字段编号。

例如:

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工具是什么?你有类似的剧本吗?

2 个答案:

答案 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。