2009-03-23 4 views
0

У меня есть данные, что выглядит следующим образом:AWK Matching положительных и отрицательных чисел

-1033 
- 
222 
100 
-30 
- 
10 

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

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

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

Работает для меня, с GNU awk. Вы уверены, что имеете в виду правильное поле? ($ 4) –

+0

думал то же самое. выглядит подозрительно –

+0

Я думаю, что awk '!/- /' тоже может работать. я читал, что это то же самое, что и awk '! ($ 0 ~ "-")', но я не совсем уверен. –

ответ

1

Ваш 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 - лучший инструмент для этого.

1

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

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

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

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

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

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

во второй позволяет пространства по обе стороны от "-" характера.

1

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

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

grep -v '^-$' 

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

grep -v '^ *- *$' 

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

+0

Файл может фактически быть файлом с несколькими столбцами с соответствующими значениями в столбце 4. Это было мое чтение. Например, файл транзакции с акциями, содержащий дату, акции, долларовую стоимость и количество в каждой строке, и вас интересуют только реальные количества. (cont ...) – paxdiablo

+0

... Такие вещи, как возврат капитала, будут связаны с изменением цены покупки, но не количества. – paxdiablo

+0

Может быть, но в этом случае почему это не так? Ударь меня. –

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