如何在字段中搜索26个选项卡

时间:2011-09-16 13:57:24

标签: unix grep

任何人都可以提供帮助

我有一个包含制表符分隔值的文件,每个记录应该有26个制表符,但有些还有更多我希望从文件中复制那些每行有26个记录的记录,这样我就可以摄取文件

等等 cat infile |grep "/t"*<26 times> >outfile

感谢

马特

3 个答案:

答案 0 :(得分:2)

试试这个:

grep '^\([^\t]*\t\){26}[^\t]*$'

它的作用是查找包含26个标签的行,这些标签可能由非标签内容分隔。 根据您的grep版本,您可能需要尝试:

grep -P'^([^ \ t] \ t){26} [^ \ t] $'

获得完整的perl regexp支持

答案 1 :(得分:2)

有可能使用grep,但是awk是为这样的任务而设计的。

awk 'BEGIN{FS="\t"}; {if ( NF == 26 ) print $0}' infile > outfile

awk有许多内置变量,FS = FieldSeperator,你可以将它设置为任何值,但这里'\ t'是表示tab char的C语言常量值。 '|' (管)char也很受欢迎。

BEGIN { ... code ... }是在处理发生之前执行的代码块。 最后一位是非BEGIN块内的代码,即{ if ( NF ... }是对每一行读取的动作。

NF =数域(的)。因此,您可以轻松地按文件中的字段数进行过滤。

NR =编号(的)记录。

另请注意,对于grepawk,无需使用cat file | ...,两个utiltites都会读取命令行传入的所有文件,即grep ... .file1 file2 ... filen

我希望这会有所帮助。

P.S。因为您似乎是新用户,如果您得到的答案可以帮助您,请记住将其标记为已接受,并且/或者给它一个+(或 - )作为有用的答案。

答案 2 :(得分:1)

简单地:

awk 'NF==26' infile > outfile

无需指定FS作为标签是默认选项卡,无需指定操作,因为awk默认操作是打印匹配记录。