Вероятно, это проблема с оптимизацией 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.
Я предполагаю, что вы имели в виду десятичные числа. В этом случае вы можете использоватьawk
:
awk '{ if ($2 == ($2+0)) print $0 }' my_file
Это пытается добавить 0
во второй столбец, чтобы проверить, является ли он числовым. (приводит к тому же значению ), и только затем печатает всю строку, т.е. $0
.
Будет напечатано только первые три строки из предоставленных вами данных.
Спасибо @msp9011 за еще более короткое эквивалентное решение:
awk '$2 == ($2+0)' my_file
Если под числовым вы подразумеваете последовательность одной или нескольких десятичных цифр, вы можете сделать (здесь, используя -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
, если хотите включить другие типы чисел.
$ 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" }