У меня есть текстовый файл с разделителями на вкладке с 11 столбцами (для некоторых строк значение некоторых столбцов включает нулевое значение). В некоторых рядах меньше столбцов. Я хочу удалить строки с меньшим количеством столбцов. Как я могу это сделать?Как удалить строки с меньшим количеством столбцов в текстовом файле, разделенном вкладкой?
ответ
Похоже, вы можете просто использовать AWK, чтобы отфильтровать строки, где NF
не 11:
awk -F'\t' 'NF == 11' file
Работает ли NF == 11, если они являются пустыми полями, разделенными только на вкладку? OP имеет вход, подобный тому, который основывается на его предыдущем аналогичном вопросе. – Inian
@ Инициал, так как разделитель полей ввода был изменен на одну вкладку, пустые поля по-прежнему считаются. Если используется 'FS', то несколько последовательных пустых символов будут рассматриваться как один разделитель полей. –
, но это ли забота о разделении выходного поля как одной вкладке? – Inian
Если у вас есть вкладка разделителями файл, например:
$ 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
В моем файле большая часть строк имеет 11 столбцов, но некоторые из них фактически имеют 10 столбцов (я не говорю о нулевых значениях, обе эти строки могут содержать некоторые нулевые значения). Как удалить строки с меньшим количеством столбцов? –
Использование решения TomFenech. Это не работает для вас? –
Этот код Perl делает именно то, что вы хотите:
а) игнорирует строки, поля счетчика Безразлично»которого т равно, что мы хотим
б) Он игнорирует строки, которые имеют пустые поля
#!/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 's/[^\t]\+/&/11;t;d' file
Это заменяет одиннадцатый, не символ табуляции (ы) с itsself или удаляет строку.
прочитайте [ask], затем повторите попытку. –