Удалить строки с нечисловым полем

Вероятно, это проблема с оптимизацией gcc и последующей таблицей номеров строк , созданной DWARF который отображает

memory addresses that contain the executable code of a program and the source lines that correspond to these addresses

(page 8)

Самое простое решение — использовать stepi при достижении функции

Из Руководство пользователя GDB (, стр. 65)

step

Continue running your program until control reaches a different source line, then stop it and return control to gdb.

....

The step command only stops at the first instruction of a source line. This pre- vents the multiple stops that could otherwise occur in switch statements, for loops, etc. step continues to stop if a function that has debugging information is called within the line. In other words, step steps inside any functions called within the line.

Also, the step command only enters a function if there is line number information for the function. Otherwise it acts like the next command. This avoids problems when using cc -gl on MIPS machines. Previously, step entered sub- routines if there was any debugging information about the routine.

2
12.09.2019, 18:43
3 ответа

Я предполагаю, что вы имели в виду десятичные числа. В этом случае вы можете использоватьawk:

awk '{ if ($2 == ($2+0)) print $0 }' my_file

Это пытается добавить 0во второй столбец, чтобы проверить, является ли он числовым. (приводит к тому же значению ), и только затем печатает всю строку, т.е. $0.

Будет напечатано только первые три строки из предоставленных вами данных.


Спасибо @msp9011 за еще более короткое эквивалентное решение:

awk '$2 == ($2+0)' my_file
3
27.01.2020, 21:51

Если под числовым вы подразумеваете последовательность одной или нескольких десятичных цифр, вы можете сделать (здесь, используя -iдля обновления файла в -месте):

perl -lani -e '
  BEGIN{$n = 0}
  if ($F[1] =~ /^\d+\z/) {print} else {$n++}
  END {print "$n line(s) were removed"}' your-file

Вы можете адаптировать регулярное выражение ^\d+\z, если хотите включить другие типы чисел.

2
27.01.2020, 21:51
$ awk 'BEGIN {count=0};
       NF>1 && $2 ~ /^[[:digit:]]+$/ {print;next};
       {count++};
       END { print "Removed " count " lines." }' input.txt 
AC 14      68123822        68123928
AC 16      34977639        34990886
AG 2       162266065       162266181
Removed 6 lines.

Если десятичные точки допустимы, используйте вместо них следующее:

$ awk 'BEGIN {count=0};
       NF>1 && $2 ~ /^[[:digit:]]+(\.[[:digit:]]+)?$/ {print;next};
       {count++};
       END { print "Removed " count " lines." }' input.txt 

Вывод для этой версии такой же, как и ваш пример ввода, потому что нет числовых -только вторых полей с десятичными точками.

Кстати, если вы не хотите, чтобы удаленные строки учитывались в основном выводе, вы можете напечатать их в stderr вместо стандартного stdout. Замените блок END на :

.
END { print "Removed " count " lines." > "/dev/stderr" }
4
27.01.2020, 21:51

Теги

Похожие вопросы