用于删除数据不完整的行的Awk或Perl解决方案

用于删除数据不完整的行的Awk或Perl解决方案,perl,awk,Perl,Awk,是否有一个Awk或Perl one liner可以删除所有没有完整数据的行。我发现自己经常需要这样的东西。例如,我当前有一个以制表符分隔的文件,如下所示: 1 asdf 2 9 asdx 4 3 ddaf 6 5 4 2 awer 4 awk -F"\t" '{if ($2 != ''){print $0}}' 1.txt > 2.txt 如何删除字段2中没有值的行 如何删除任何字段中没有值的行 我试着这样做: 1

是否有一个Awk或Perl one liner可以删除所有没有完整数据的行。我发现自己经常需要这样的东西。例如,我当前有一个以制表符分隔的文件,如下所示:

1    asdf    2
9    asdx    4
3    ddaf    6
5            4
2    awer    4
awk -F"\t" '{if ($2 != ''){print $0}}' 1.txt > 2.txt
如何删除字段2中没有值的行

如何删除任何字段中没有值的行

我试着这样做:

1    asdf    2
9    asdx    4
3    ddaf    6
5            4
2    awer    4
awk -F"\t" '{if ($2 != ''){print $0}}' 1.txt > 2.txt

谢谢。

在awk中,如果您知道每行应该正好有3个元素:

awk -F'\t+' 'NF == 3' INFILE > OUTFILE

对于具体解决方案:

awk -F'\t' '$2 != ""' input.txt > output.txt
对于通用的解决方案:

awk -F'\t' -vCOLS=3 '{ 
    valid=1; 
    for (i=1; i<=COLS; ++i) { 
        if ($i == "") { 
            valid=0; 
            break; 
        } 
    } 
    if (valid) { 
        print; 
    } 
}' input.txt > output.txt
awk-F'\t'-vCOLS=3'{
有效=1;

对于(i=1;i我只会查找连续的制表符,或前导或尾随制表符:

perl -ne 'next if /\t\t/ or /^\t/ or /\t$/; print' tabfile

只需使用
awk'NF==3'infle>OUTFILE
,它将只使用空白(制表符、空格等)作为字段拆分器。

谢谢。我没有注意到NF变量。这正是我要查找的。当文件包含有空格的值时,这将不起作用。Hmmm。我尝试了此操作,但awk正在将选项卡字符之间的空白读取为字段。有什么建议吗?问题是,它仍然不能作为空字段工作(
5\t\t4
)意味着NF是3,因此解决方案不起作用。在shell命令中使用\字符时要小心。在本例中,“\t”如果您使用
-F'\t'
,那么您的一行程序就可以工作了。+1是唯一不需要知道列数的解决方案。您可能需要使用[]+在标签之间,因为在本生博士提到的一条评论中,标签之间的空间是可能的