2014-12-29 4 views
-6

Я ищу что-то вроде этого:Добавление отдельных номеров в файле с использованием AWK или Grep

ИМЯ ФАЙЛА: fruites.txt

Apple a day keeps doctor away 
but people dont like it............... 23 peoples found. 

Banana_A.1 keeps u fit 
and its very tasty.................... 12 peoples found. 

Banana_B.2 juices is very good to taste 
and most people like them 
as well as consumed the most.......... 15 peoples found. 

Anar is difficult to eat 
as well as its very costly............ 35 peoples found. 

grapes are easy to eat 
and people like it the most........... 10 peoples found. 

fruites are very healthy and improves vitamins. 

Apple : The apple tree is a deciduous tree in the rose family best known for its sweet, pomaceous  
fruit, the apple. 

Banana_A.1: A banana is an edible fruit, botanically a berry, produced by several kinds of large 
herbaceous flowering plants in the genus Musa. 

Banana_B.2: A banana is an fruit, botanically a kerry, produced by several kinds of large 
herbaceous flowering plants in the genus Musa. 

Anar : The pomegranate, botanical name Punica granatum, is a fruit-bearing deciduous shrub or 
small tree growing between 5 and 8 m tall. 

Я хочу добавление всех народов, кроме найденных банан

ANS: 68 (23 + 35 + 10)

Я могу найти количество отдельно, но не смог вычитать их

Я попытался как этот

Grep -Е ".found" fruites.txt | AWK '{сумма + = $ 3} END {Печать сумма}'

АНС: 95 (68 + 27)

Grep -E "банан | .found" fruites.txt | grep -A1 "Банан" | grep -E ".found" | AWK '{сумма + = $ 3} END {печать сумма}'

И: 27 (только бананы)

Может кто-нибудь, пожалуйста, помогите

+0

Почему так много downvotes? – Ramesh

ответ

2
awk '$1 != "Banana" {s+=$(NF-2)} END { print s}' RS= fruites.txt 

Ключевым моментом здесь является RS= задание, которое делает AWK лакомство каждый раздел текста, ограниченный пустыми строками в виде отдельной записи. Обратите внимание, что вы можете написать RS="" fruites.txt для ясности, но это необязательно. Не забудьте пропустить пробел после =, хотя, поскольку ключ должен иметь пустую строку как значение RS.

- Edit -

Учитывая замечания и модифицированный вопрос, возможно, вы хотите:

awk '! match($1,"Banana") && match($NF, "found") { 
    s += $(NF-2)} END { print s }' RS= fruites.txt 
+0

Я обновил вопрос. если в банане есть несколько строк о банане. NF не работает. Не могли бы вы помочь? – Ramesh

+0

Просто измените '$ 1! = Банана' на более общее сравнение:'! ($ 1, «Банана») ' –

+0

awk '$ 1 ==" Banana_A.1 "{print $ NF} RS = fruit.txt ans подходит и не найден. Как Banana_A.1 и нашел. находятся в разных строках. Не могли бы вы заглянуть в нее. – Ramesh

0

Вы можете использовать следующую команду AWK.

$ awk -v RS="\n\n" '!/Banana/ && /peoples found\.$/{s+=$(NF-2)} END { print s}' file 
68 

Вышеуказанная команда AWK устанавливает пустую строку \n\n в качестве значения Seperator записи и проверки на несуществовании Banana строки и существование peoples found. струны в последний. Если оба условия выполнены, тогда будет вычисляться только сумма третьего столбца из последнего. Таким образом, s+=$(NF-2) также написано как s = s + $(NF-2) содержит сумму. Распечатка значения s на последней даст вам общую сумму.

+0

Зачем нужен downvote? –

+0

Привет Авинаш, Одно небольшое сомнение. Не могли бы вы помочь? ЕСЛИ у меня есть несколько каталогов, содержащих fruites.txt. Тогда мне нужно использовать цикл. Не могли бы вы помочь в этом. Например: если у меня есть 200 каталогов и получить вывод как «directory1 --- sum directory2 ---- sum», – Ramesh

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