我有一个带有11列的制表符分隔文本文件(对于某些行,某些列的值包含空值)。有些行的列数较少。我想删除列数较少的行。我怎么能这样做?
答案 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个非制表符或删除该行。