【发布时间】:2017-05-09 23:15:19
【问题描述】:
我有一个包含 11 列的制表符分隔的文本文件(对于某些行,某些列的值包括空值)。有些行的列较少。我想删除列较少的行。我该怎么做?
【问题讨论】:
-
阅读How to Ask然后再试一次。
我有一个包含 11 列的制表符分隔的文本文件(对于某些行,某些列的值包括空值)。有些行的列较少。我想删除列较少的行。我该怎么做?
【问题讨论】:
听起来您可以只使用 awk 过滤掉 NF 不是 11 的行:
awk -F'\t' 'NF == 11' file
【讨论】:
FS,则多个连续的空白字符将被视为单个字段分隔符。
如果您有一个制表符分隔的文件,例如:
$ 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
【讨论】:
此 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);
}
【讨论】:
这可能对你有用(GNU sed):
sed 's/[^\t]\+/&/11;t;d' file
这会将第十一个非制表符替换为自身或删除该行。
【讨论】: