任何人都可以提供帮助
我有一个包含制表符分隔值的文件,每个记录应该有26个制表符,但有些还有更多我希望从文件中复制那些每行有26个记录的记录,这样我就可以摄取文件
等等cat infile |grep "/t"*<26 times> >outfile
感谢
马特
答案 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 =编号(的)记录。
另请注意,对于grep
或awk
,无需使用cat file | ...
,两个utiltites都会读取命令行传入的所有文件,即grep ... .file1 file2 ... filen
我希望这会有所帮助。
P.S。因为您似乎是新用户,如果您得到的答案可以帮助您,请记住将其标记为已接受,并且/或者给它一个+(或 - )作为有用的答案。
答案 2 :(得分:1)
简单地:
awk 'NF==26' infile > outfile
无需指定FS作为标签是默认选项卡,无需指定操作,因为awk默认操作是打印匹配记录。