如何删除选项卡分隔文本文件中列数较少的行?

时间:2016-12-24 16:50:06

标签: bash text awk sed grep

我有一个带有11列的制表符分隔文本文件(对于某些行,某些列的值包含空值)。有些行的列数较少。我想删除列数较少的行。我怎么能这样做?

4 个答案:

答案 0 :(得分:3)

听起来你可以使用awk过滤出NF不是11的行:

awk -F'\t' 'NF == 11' file

答案 1 :(得分:2)

如果您有制表符分隔文件,例如:

$ cat foo
1       2       3
4               6
7

或更生动地说:

1\t2\t3
4\t\t6
7\t\t

每个记录的字段数仍为3:

$ awk -F'\t' '{print NF}' foo
3
3
3

如果要打印没有空字段的记录:

$ awk -F'\t' '{for(i=1;i<=NF;i++) if($i=="") next}1' foo
1       2       3

答案 2 :(得分:0)

这个Perl代码完全符合您的要求:

a)它忽略了其字段数不等于我们想要的行

b)它忽略具有空字段的行

#!/usr/bin/env perl
my ($fields, $f, $n, $size);
my $NUM_FIELDS = 11;
while (<STDIN>) {
  chomp;
  @fields = split(/,/, $_);
  next if $#fields + 1 != $NUM_FIELDS;
  $n = 0;
  foreach $f (@fields) {
    break if length($f) == 0;
    $n++;
  }
  printf("%s\n", $_) if ($n == $NUM_FIELDS);
}

答案 3 :(得分:0)

这可能适合你(GNU sed):

context

用自己替换第11个非制表符或删除该行。