0

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

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

提前致谢

4

3 回答 3

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 '/\t\.\t/d' input.txt > out.txt 
于 2012-06-28T16:27:22.880 回答
1

不确定有什么方法可以更优雅地做到这一点,但这应该可行:

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

这基本上连接了所有相关字段并搜索 . 在结果中,并且仅在不匹配时打印。

于 2012-06-28T16:28:38.420 回答
1

变体sed

sed '/\([^\t]*\t\)\{2\}.*\t\.\t/d' input.txt > out.txt
于 2012-06-28T16:30:23.797 回答