Bash и для цикла - PullRequest
       1

Bash и для цикла

1 голос
/ 22 сентября 2011

У меня есть два файла со следующими строками:

Файл1:

[2011-09-21 11: 27: 44.663] EXT-RESPONSE | 13166260540762613 | 50498692776 | 4 | Активация |0 | 600 [2011-09-21 11: 27: 44.906] EXT-RESPONSE | 13166260643402689 | 50494792676 | * 702 | Активация | 0 | 600 [2011-09-21 11: 27: 44.907] EXT-RESPONSE | 13166260644572692 | 50497855449| * 702 | Активация | 0 | 600 [2011-09-21 11: 27: 45.334] EXT-RESPONSE | 13166260649992694 | 50496364022 | * 902 | Активация | 0 | 600 [2011-09-21 11: 27: 45.437] EXT-RESPONSE | 13166260650582695 | 50497646930 | * 702 | Активация | 0 | 600 [2011-09-21 11: 27: 45.639] EXT-RESPONSE | 13166260651372696 | 50494876344 | * 702 | Активация | 0 | 516 [2011-09-21 11: 27: 45.639] EXT-RESPONSE | 13166260651372696 | 50494876344 | * 702 | Активация | 0 | 605 [2011-09-21 11: 27: 45.639] EXT-RESPONSE | 13166260651372696 | 50494876344 | * 702 | Активация | 0 | 600 [2011-09-21 11: 27: 45.733] EXT-RESPONSE | 13166260623002676 | 50499119706 | 2 | Активация | 0 | 600 [2011-09-21 11: 27: 45.755] EXT-RESPONSE | 13166260653182698 | 50496437811 | * 702 | Активация| 0 | 600

Файл2:

[2011-09-21 11: 27: 44.663] EXT-RESPONSE | 13166260540762613 | 50498692776 | 4 | Активация | 0 | 600 [2011-09-21 11: 27: 44.906] EXT-RESPONSE| 13166260643402689 | 50494792676 | * 702 | Активация | 0 | 600 [2011-09-21 11: 27: 44.907] EXT-RESPONSE | 13166260644572692 | 50497855449 | * 702 | Активация | 0 | 600 [2011-09-21 11:27: 45.334] EXT-RESPONSE | 13166260649992694 | 50496364022 | * 902 | Активация | 0 | 600 [2011-09-21 11: 27: 45.437] EXT-RESPONSE | 13166260650582695 | 50497646930 | * 702 | Активация | 0 | 600 [2011-09-21 11: 27: 45.639] EXT-RESPONSE | 13166260651372696 | 50494876344 | * 702 | Активация | 0 | 504 [2011-09-21 11: 27: 45.639] EXT-RESPONSE | 13166260651372696 | 50494876344 | * 702 | Активация |0 | 605 [2011-09-21 11: 27: 45.639] EXT-RESPONSE | 13166260651372696 | 50494876344 | * 702 | Активация | 0 | 600 [2011-09-21 11: 27: 45.733] EXT-RESPONSE | 13166260623002676 | 50499119706| 2 | Активация | 0 | 504 [2011-09-21 11: 27: 45.755] EXT-RESPONSE | 13166260653182698 | 50496437811 | * 702 | Активация | 0 | 600

Я хочу прочитать оба файла насценарий оболочки и получить некоторые значения ... я чave создал For для работы с обоими файлами ...

Вот сценарий ..

#!/bin/bash

UD_GW1='/root/Lab/UD_GW1'
UD_GW2='/root/Lab/UD_GW2'
i='1'
while [ $i -le "2" ]; do
for e in  $UD_GW1 $UD_GW2 ; do
echo "TABLE USSD_GW$i"  
echo "START_SAMPLE_PERIOD"
while read numcodigo; do
cantidad_uniq=`tail -n 60000 $e | egrep "EXT-RESPONSE" | cut -d '|' -f 7 | egrep -v ^$  | egrep "$numcodigo" | wc -l`
echo "$numcodigo".Metric" "=" $numcodigo"
echo "CantCod."$numcodigo"Metric "=" $cantidad_uniq"
done #fin while read numcodigo;   
echo "END_SAMPLE_PERIOD"
echo "END_TABLE"
let i=$i+1
done
done

И мне нужно что-то вроде:

TABLE USSD_GW1
START_SAMPLE_PERIOD
600.Metric = 600
CantCod.600Metric = 8
518.Metric = 518
CantCod.518Metric = 0
504.Metric = 504
CantCod.504Metric = 0
516.Metric = 516
CantCod.516Metric = 1
527.Metric = 527
CantCod.527Metric = 0
END_SAMPLE_PERIOD
END_TABLE
TABLE USSD_GW2
START_SAMPLE_PERIOD
600.Metric = 600
CantCod.600Metric = 7
518.Metric = 518
CantCod.518Metric = 0
504.Metric = 504
CantCod.504Metric = 2
516.Metric = 516
CantCod.516Metric = 0
527.Metric = 527
CantCod.527Metric = 0
END_SAMPLE_PERIOD
END_TABLE

Однако, когда я запускаю свой сценарий, я получаю:

TABLE USSD_GW1
START_SAMPLE_PERIOD
600.Metric = 600
CantCod.600Metric = 8
518.Metric = 518
CantCod.518Metric = 0
504.Metric = 504
CantCod.504Metric = 0
516.Metric = 516  
CantCod.516Metric = 1
527.Metric = 527
CantCod.527Metric = 0
END_SAMPLE_PERIOD
END_TABLE 
TABLE USSD_GW2
START_SAMPLE_PERIOD
END_SAMPLE_PERIOD
END_TABLE

Пожалуйста, любая помощь будет отличной ....

Спасибо,

Майкл.

Ответы [ 2 ]

0 голосов
/ 22 сентября 2011

У меня есть несколько предложений для вашего сценария.Почему бы вам не использовать массив для файлов, а также переместить логику отображения в функцию?
Преимущество использования массива состоит в том, что вы можете легко расширить его до нескольких файлов (более 2 в текущем случае)
Разделение логики дисплея на функцию поможет вам легко отладить и изменить логику

 #!/bin/bash
 #First param is the file to read to check for codes
 #Second param is the file to read the codes from 
 function display_info()
 {
    #Your display logic is here...
    for numcodigo in `cat $2`
    do
     cantidad_uniq=`tail -n 60000 $1 | egrep "EXT-RESPONSE" | cut -d '|' -f 7 | egrep -v ^$  | egrep "$numcodigo" | wc -l`
     echo "$numcodigo".Metric" "=" $numcodigo"
     echo "CantCod."$numcodigo"Metric "=" $cantidad_uniq"
    done 
 }

 #Main operation
 #Array elements are space separated
 #newline is used only to make it more readable & easier to add new array elements
 file_list=(
  /root/Lab/UD_GW1 
  /root/Lab/UD_GW2
  )
 index=1
 for file in ${file_list[@]}
 do
     echo "TABLE USSD_GW$index"  
     echo "START_SAMPLE_PERIOD"
     #Pass file to read from the list as first param
     #Pass file to read the codes to check from command line argument as second param
     display_info $file $1 
     echo "END_SAMPLE_PERIOD"
     echo "END_TABLE"
     let "index++"
 done

Надеюсь, это поможет!
PS: Кстати, как ваш вывод имеет 518 и т. Д., Которых нет в файлах?Вы проверяете токены из других мест?
РЕДАКТИРОВАТЬ:
Пожалуйста, запустите этот скрипт как ./<scripts_name> codes.txt
Есть альтернатива для достижения того, что вам нужно, но это только один из способов!

0 голосов
/ 22 сентября 2011

удалить цикл while и ссылки на i.Вам нужен только цикл for.

В качестве альтернативы вы можете удалить цикл for, назначив e=/root/Lab/UD_GW$i

Вы также должны написать внутренний цикл как cat $e | while read numcodigo; do

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