2016-12-24 2 views
-1

У меня есть текстовый файл с разделителями на вкладке с 11 столбцами (для некоторых строк значение некоторых столбцов включает нулевое значение). В некоторых рядах меньше столбцов. Я хочу удалить строки с меньшим количеством столбцов. Как я могу это сделать?Как удалить строки с меньшим количеством столбцов в текстовом файле, разделенном вкладкой?

+1

прочитайте [ask], затем повторите попытку. –

ответ

3

Похоже, вы можете просто использовать AWK, чтобы отфильтровать строки, где NF не 11:

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

Работает ли NF == 11, если они являются пустыми полями, разделенными только на вкладку? OP имеет вход, подобный тому, который основывается на его предыдущем аналогичном вопросе. – Inian

+0

@ Инициал, так как разделитель полей ввода был изменен на одну вкладку, пустые поля по-прежнему считаются. Если используется 'FS', то несколько последовательных пустых символов будут рассматриваться как один разделитель полей. –

+0

, но это ли забота о разделении выходного поля как одной вкладке? – Inian

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 
+0

В моем файле большая часть строк имеет 11 столбцов, но некоторые из них фактически имеют 10 столбцов (я не говорю о нулевых значениях, обе эти строки могут содержать некоторые нулевые значения). Как удалить строки с меньшим количеством столбцов? –

+0

Использование решения TomFenech. Это не работает для вас? –

0

Этот код 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); 
} 
+0

Я не хочу игнорировать строки с нулевыми значениями! почти все строки имеют несколько нулевых значений. Я просто хочу игнорировать строки с меньшим количеством столбцов, чем другие. и я хочу изменить файл на месте. –

0

Это может работать для вас (GNU СЭД):

sed 's/[^\t]\+/&/11;t;d' file 

Это заменяет одиннадцатый, не символ табуляции (ы) с itsself или удаляет строку.

 Смежные вопросы

  • Нет связанных вопросов^_^