AWK соответствие положительных и отрицательных чисел - PullRequest
0 голосов
/ 23 марта 2009

У меня есть данные, которые выглядят так:

-1033  
-  
222
100
-30
-
10

То, что я хочу сделать, это захватить все числа, исключая запись «только тире».

Почему мой awk ниже не удался?

 awk '$4 != "-" {print $4}'

Ответы [ 3 ]

1 голос
/ 23 марта 2009

Предполагая, что ваш файл данных является на самом деле многостолбцовым, и что значения находятся в столбце 4, будет работать следующее:

awk '$4 != "-" {print $4} {}'

Печатает значение только там, где оно не "-". Ваша версия, вероятно, напечатает значение независимо (или дважды), поскольку действие по умолчанию - печать. Добавление {} делает действие по умолчанию "ничего не делать".

Если данные на самом деле такие, как показано (только один столбец), вы должны использовать $1, а не $4 - я бы не стал использовать $0, так как это целая строка и кажется, что у вас есть пробелы конец первых двух строк, из-за которых $0 будет "-1033 " и "- ".

Но если бы это был один столбец, я бы вообще не использовал awk, а скорее:

grep -v '^-$'
grep -v '^ *- *$'

второй, допускающий пробелы по обе стороны от символа "-".

1 голос
/ 23 марта 2009

Почему вы проверяете $4? Похоже, вы должны проверить $1 или $0, как сказал горит.

Но awk - тяжелый инструмент для этой работы. Попробуйте

grep -v '^-$'

Чтобы удалить строки, содержащие только тире или

grep -v '^ *- *$'

Чтобы удалить строки, содержащие только тире и, возможно, несколько пробелов.

1 голос
/ 23 марта 2009

Ваш awk скрипт говорит

Если четвертое поле не является тире, распечатайте его

Однако вы хотите распечатать его, если строка не является чертой

awk '$0 != "-"'

Действие по умолчанию - печать, поэтому тело не требуется.

Если вы хотите напечатать группу чисел, вы можете использовать расширение GNU awk, если вы используете gawk. Позволяет разбивать записи по регулярным выражениям:

gawk 'BEGIN { RS="(^|\n)-($|\n)" } { print "Numbers:\n" $0 }'

Теперь вместо строк требуется группа чисел, разделенных строкой, содержащей только -. Установка разделителя полей (FS) на новую строку позволяет перебирать числа в такой группе:

gawk 'BEGIN { FS="\n"; RS="(^|\n)-($|\n)" } 
      { print "Numbers:"; for(i=1;i<=NF;i++) print " *: " $i }'

Однако я согласен с другими ответами. Если вы просто хотите отфильтровать строки, соответствующие некоторому тексту, grep - лучший инструмент для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...