ste*_*fan 1 bash regular-expression
我有几个(准确地说是 427 个)文本文件,每行一百万行,每行包含 31 个数字,由空格(可能是双空格)分隔。但是,可能存在一些数据损坏,并且可能存在包含垃圾的行。
我现在想检查每一行是否满足包含 31 个由空格分隔的项目的属性(我假设这些项目是数字。检查它的方法也会更好)。
我现在的方式是
while read line;
do
if [ $(echo "$line" | sed 's/ /\n/g' | grep -v "^$" | wc -l) -ne 31 ]
then
echo "$file bad";
fi
done < $file
Run Code Online (Sandbox Code Playgroud)
这将用换行符替换一行的所有空格,过滤空行,计算行数并将其与 31 进行比较。
这种方法很慢,可能有更好的方法涉及一些花哨的正则表达式。什么是更快的方法?
为什么不只是grep
一个人?
bash-4.2$ cat file
1 2 -3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
32 33 -34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 L 51 52 53 54 55 56 57 58 59 60 61 62
63 64 -65 66 67 68 69
70 71 -72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
# listing bad lines in the file
bash-4.2$ grep -Exv '(-?[[:digit:]]+ +){30}-?[[:digit:]]+' file
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 L 51 52 53 54 55 56 57 58 59 60 61 62
63 64 65 66 67 68 69
# listing files with bad lines
bash-4.2$ grep -Exvl '(-?[[:digit:]]+ +){30}-?[[:digit:]]+' -- *
file
Run Code Online (Sandbox Code Playgroud)