2014-10-10 3 views
1

bПожалуйста, у меня есть файл журнала «log1.txt», который содержит поля, разделенные символом «|» Я хочу, чтобы извлечь строки в соответствии с конкретными требованиями и у меня есть еще один конфигурационный файл «code.conf» или я помещал найденные значения в поле 5. здесь файл журнала:извлекать информацию из файла на основании условий

+++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++

abc|2| 11| 3| 1000| 13|scql| 0| | | 0| 0| plk| stv| 2| 0 

trc|2| 20| 3| 1200| 30|tkgl| 0| pajd|jahd| 0| 0| klm|fdkl|1|0 

klm|2| 0| 3| 1300| 19|mlpo| 0| | | 0| 0| qnhd| pkjs| 2| 0 

klm|2| 20| 3| 1600| 11|mlpo| 19| | | 0| 0| qnhd| pkjs| 2| 0 

++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++

И вот конфигурационный файл «code.conf»

++++++++++++++++++++++++++++++++++++++++++++++++ +++++

1000 

1300 

1200 

1600 

++++++++++++++++++++++++++++++++++++++ +++++++++++++++

Теперь я хочу, чтобы извлечь из файла журнала только строки, соответствующие этим условиям:

если поле 2 равно «2» и поле 4 равным «3», а поле 5 должно содержать одно из значений, объявленных в файле конфигурации, и (поле 3 не равно «0» или «20» или) или поле 8 не равно «0»

Я попытался это, но не работает правильно:

awk -F' *\\| *' 'FNR==NR {a[$1];next} $2==2 && $4==3 && $5 in a && ($3!=0 || $3!=20)|| $8!=0 ' file 

вывод должен быть:

abc|2| 11| 3| 1000| 13|scql| 0| | | 0| 0| plk| stv| 2| 0 

klm|2| 20| 3| 1600| 11|mlpo| 19| | | 0| 0| qnhd| pkjs| 2| 0 

Я думаю, что ошибка происходит из логики

спасибо

+0

Как 1600 на выходе, когда он не в 'code.conf'? – anubhava

+0

это просто ошибка 1600 существует в code.conf, я добавлю его – mond14

ответ

0

У вас есть перепутали && и || в вашей команде awk. Используйте это:

awk -F' *\\| *' 'FNR==NR {a[$1];next} $2==2 && $4==3 && $5 in a && 
     (($3!=0 && $3!=20) || $8!=0)' code.conf file 
abc|2| 11| 3| 1000| 13|scql| 0| | | 0| 0| plk| stv| 2| 0 
klm|2| 20| 3| 1600| 11|mlpo| 19| | | 0| 0| qnhd| pkjs| 2| 0 
+0

, но в случае $ 3, равного 0 или 20, и поле $ 8 не равно 0, это правильный случай – mond14

+0

Итак, вы получаете ожидаемый выход aren ' ты? – anubhava

+0

нет, потому что если поле 3 $ 3 равно 0 или 20, а поле $ 8 не равно 0, эта строка должна присутствовать на выходе. – mond14

0

попробовать это:

awk -F' *\\| *' 'FNR==NR {a[$1];next} ($2==2 && $4==3 && $5 in a &&$3 != 20) || $8 != 0)' code.conf test.txt 
+4

Необъяснимые блоки кода могут быть трудными для неопытных пользователей расшифровать и не помогают людям понять решение. Не могли бы вы вкратце объяснить, что это делает, и как он исправляет проблему? – anaximander

+1

Пожалуйста, объясните свой код! –

+0

Прочитайте условие в awk, и в этом разница. – SMA

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