Shell脚本查找分隔符



我有一个包含三列的文件,其中使用pipe作为分隔符。现在,由于某些错误,文件中的某些行可以使用","而不是"|"。我想输出所有这样的错误行

您也可以使用grep,它更复杂:

egrep "|.*|.*|" input
echo No pipe
egrep "^[^|]*$" input
echo One pipe
egrep "^[^|]*|[^|]*$" input
echo 3+ pipe
egrep "|[^|]*|[^|]*|" input

在组合greps之前,首先引入新的变量P(有管)和n(无管)

p="|"
n="[^|]*"
echo "p=$p, n=$n"
echo No pipe
egrep "^$n$" input
echo One pipe
egrep "^$n$p$n$" input
echo 3+ pipe
egrep "$p$n$p$n$p" input

现在集合起来

egrep "^$n$|^$n$p$n$|$p$n$p$n$p" input

编辑:注释和变量名是关于"斜杠"的,但它们是管道(带反斜杠)。这有点让人困惑

要计算awk的列数,可以使用NF变量:

$ cat file
ABC|12345|EAR
PQRST|123|TWOEYES
ssdf|fdas,sdfsf
$ awk -F| 'NF!=3' file
ssdf|fdas,sdfsf

然而,这似乎并没有涵盖所有可能的数据损坏的方式,基于问题的各种修订和评论。

一个更好的方法是定义数据必须遵循的精确的格式。例如,假设一行是"正确的",如果它有三列,只有第一个和第三个字母,第二个数字,您可以编写以下脚本来匹配所有不符合的行:
awk -F| '!(NF==3 && $1$3 ~ /^[a-zA-Z]+$/ && $2+0==$2)' file

Test(注意只有第二行(符合要求的)没有被打印):

$ cat file
A,BC|12345|EAR
PQRST|123|TWOEYES
ssdf|fdas,sdfsf
ABC|3983|MAKE,
sf dl lfsdklf |kldsamfklmadkfmask |mfkmadskfmdslafmka
ABC|abs|EWE
sdf|123|123
$ awk -F| '!(NF==3&&$1$3~/^[a-zA-Z]+$/&&$2+0==$2)' file
A,BC|12345|EAR
ssdf|fdas,sdfsf
ABC|3983|MAKE,
sf dl lfsdklf |kldsamfklmadkfmask |mfkmadskfmdslafmka
ABC|abs|EWE
sdf|123|12

您可以根据您认为有效的输入调整上述命令以适应您的特定需求。例如,如果您还希望将每行的长度限制为50个字符,则可以使用

awk -F| '!(NF==3 && $1$3 ~ /^[a-zA-Z]+$/ && $2+0==$2 && length($0)<50)' file

最新更新