删除所有不是 7 个数字序列的行

删除所有不是 7 个数字序列的行

我有一个像这样的文本文件:

229;39;45;11;21;33;13
230;56;44;41;40;08;53
231;16;59;27;42;44;36
232;29;19;41;22;37;59
233;45;03;24;36;07;32
SP;SP;SP;;;;
234;15;45;54;25;42;41
235;29;41;55;02;31;22
236;10;52;50;57;25;60
237;36;07;45;31;56;57
238;15;09;41;13;37;42
SP;SP;;;;;
239;33;21;44;46;47;06
240;59;28;25;41;57;38
241;11;57;40;35;56;31
242;22;07;04;21;28;56
243;20;47;23;32;16;11
244;19;60;50;24;47;33
245;44;51;27;53;08;60
MG;;;;;;

正确的行是由分号分隔的七个数字组成的序列。在随机位置上,有些行是垃圾行,例如MG;;;;;;SP;SP;;;;;

我应该在终端上输入什么命令才能从包含数千行的文件中删除这些错误的行,只保留七个数字序列的行?

答案1

grep -Ex '[0-9]+(;[0-9]+){6}'

...根据您的输入数据产生以下输出:

229;39;45;11;21;33;13
230;56;44;41;40;08;53
231;16;59;27;42;44;36
232;29;19;41;22;37;59
233;45;03;24;36;07;32
234;15;45;54;25;42;41
235;29;41;55;02;31;22
236;10;52;50;57;25;60
237;36;07;45;31;56;57
238;15;09;41;13;37;42
239;33;21;44;46;47;06
240;59;28;25;41;57;38
241;11;57;40;35;56;31
242;22;07;04;21;28;56
243;20;47;23;32;16;11
244;19;60;50;24;47;33
245;44;51;27;53;08;60

答案2

sed

sed -n '/^[0-9][0-9]*\(;[0-9][0-9]*\)\{6\}$/p' <infile

答案3

egrep '^[0-9]+;[0-9]+;[0-9]+;[0-9]+;[0-9]+;[0-9]+;[0-9]+$' file > temp && mv temp file

答案4

这些并不像其他一些示例那样强大,但适用于简单的情况:

grep -v ';;'

或者

grep [[:digit:]]

相关内容