2012-04-11 3 views
0

У меня есть программа, которая отправляет текст в стандартный вывод. Но я хочу сохранить только те строки, где пятый столбец не «*». Это символ asterisk, а не выражение регулярного выражения, которое ловит все. Я не могу использовать побег для этого, я попыталсятолько строки печати с определенным столбцом не *

./a.out |awk '$5!=* {print}' 
awk: $5!=* {print} 
awk: ^syntax error 
./a.out |awk '$5!=\* {print}' 
awk: $5!=\* {print} 
awk: ^backslash not last character on line 

Awk, конечно, не является обязательным требованием, но я думал, что это было бы самым простым.

Благодаря

ответ

4

awk похож на большинство языков Алгол/C-семьи; Литеральные строки требуют строковых кавычек.

awk '$5 != "*" {print}' 
+2

Поскольку действие по умолчанию для 'awk' является печать, вы могли бы просто написать:' AWK «$ 5 =„*“' имя файла – JRFerguson

+0

Вам не нужен print, это значение по умолчанию в awk: 'awk '$ 5! =" * "''. – jfg956

1

В Perl:

perl -ane 'print unless $F[4] eq q(*)' file 

Переключатель -n оборачивает этот цикл aaround скрипт для чтения имя файла аргумент (ы) в командной строке:

LINE: 
while (<>) { 
    ... # your script here 
} 

. -a удерживает авторасщестку строки (в пробеле) в предопределенном массиве под названием @F. Unlike awk` $ F [0] - это первое поле.

Аргумент -e - это просто ваш сценарий.

+0

Переключатель '-n' добавляет этот цикл вокруг вашего скрипта для чтения одного или нескольких аргументов имени файла: – JRFerguson

-1

Это может работать для вас:

awk '$5 !~ /^[*]$/' file 
+0

-1. Бесполезное использование регулярного выражения для выполнения фиксированного сравнения строк. – Kaz

+0

@kaz намерение состояло в том, чтобы показать, что символ '*' может быть показан некорректно как символ класса – potong

+0

Это вряд ли некорректно. Он завернут внутри [], который завернут внутри^$, который завернут внутри //. – Kaz

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