匹配指定列范围不包含点字符的行

时间:2012-06-28 15:50:44

标签: regex linux awk

我有一个制表符分隔的文件,如下所示:

2L <TAB> 440 <TAB> . <TAB> . <TAB> . <TAB> 1/1:49:42,6,0  
2L <TAB> 260 <TAB> 0/1:66:63,0,207 <TAB> . <TAB> . <TAB> 1/1:49:42,6,0
2L <TAB> 595 <TAB> 0/1:11:85,0,8 <TAB>0/1:13:132,0,10 <TAB>0/1:73:70,0,131<TAB> 0/1:59:72,0,56

在这个例子中,我只包含6列,但实际文件本身总共包含19列。如何使用awk提取行,以便从第3列开始的每列都有除点(。)字符以外的内容?从上面的例子中,我想输出第3行,因为所有6列都不是空的,并且没有点字符作为它们的值。

我尝试了一些命令,例如下面的命令,但它似乎没有用。

awk '$3-$19==0-9' input.txt > out.txt

提前致谢

3 个答案:

答案 0 :(得分:2)

AWK:

awk -F'\t' '{ for(i=3;i<=NF;i++)if($i ==".") next; print}' input.txt > out.txt

awk -F'\t' '!/\t\.\t/' input.txt > out.txt

sed的:

sed '/\t\.\t/d' input.txt > out.txt 

答案 1 :(得分:1)

不确定是否可以更优雅地做到这一点,但这应该有效:

awk '$3$4$5$6$7$8$9$10$11$12$13$14$15$16$17$18$19 !~ /\./ {print}'

基本上连接所有相关字段并搜索a。在结果中,只有在不匹配时才打印。

答案 2 :(得分:1)

变体与sed

sed '/\([^\t]*\t\)\{2\}.*\t\.\t/d' input.txt > out.txt