2017-01-06 8 views
0

У меня есть файл, который содержит данные, как показано ниже:Shell скрипт для чтения файла строка за строкой и найти значение больше, чем 1000 и печать

SYSTEM: Running, Fri Jan 6 00:00:01 GMT 2017 

    29 DEADLETTER 
    123 SU 
    1234 SR 
    100089 SM 
    1278969 DR 

Из этого файла, я хочу, чтобы прочитать каждую строку и найти значение который больше 1000, и если его более 1000 выполняют 1 набор команд, если его менее 1000 выполняет другой набор команд.

Возможно ли это?

+0

Да, вы можете извлечь числовую часть с регулярными выражениями –

+0

Это образец файла, у меня есть больше, чем 1000 строк, так как я могу прочитать каждую строку и проверить значение более 1000. Я понимаю, что while/for цикл я могу читать строку. Но не уверен в регулярном выражении. Возможно ли вам помочь? – user3171821

ответ

0

Позвольте мне поделиться одним из способов сделать это (я считаю, что кто-то может поделиться лучшим) Вам нужно удалить/пропустить первую строку файла, чтобы сделать эту работу.

while read line 
do 
    num=`echo $line | cut -d " " -f1` 
    if (($num > 1000)); 
    then 
     "Your if logic" 
    else 
     "Your else logic" 
    fi ; 
done< filename 
0

Я хотел бы использовать awk так:

awk 'NR<3{next} $1<1000 {system("echo 1")} $1>1000{system("echo 2")}' file 

Выход

1 
1 
2 
2 
2 

Это говорит ... «Если номер строки меньше, чем 3, забыть его и перейдите к следующей строке. Если первое поле меньше 1000, запустите команду echo 1. Если первое поле больше 1000, введите команду echo 2 ".

Обратите внимание, что ваш вопрос не имеет дело с числом будучи ровно 1000, так и не делает мой ответ, - но вы могли бы использовать $1<=1000, если вы хотите, чтобы сделать это дело с 1000


Если вы действительно хотел использовать только bash оболочки:

#!/bin/bash 
{ read header 
    read header 
    while read f1 f2; do 
    [ $f1 -lt 1000 ] && echo 1 
    [ $f1 -gt 1000 ] && echo 2 
    done } < file 

{...} является составной оператор, который считывает file. Внутри я читаю и отбрасываю две строки заголовка, затем вводя петлю, читающую последующие строки, на два отдельных поля: f1 и f2. Затем я проверить значение f1 и выполнять различные echo в зависимости от того, меньше или больше, чем 1000.

То же самое дело, как и выше с первого поля будучи точно 1000 поле - вы можете использовать -le для «меньше или равными « и -ge для « больше или равно ».


Или вы могли бы использовать sed, чтобы избавиться от 2 заголовка линии, как это:

#!/bin/bash 
sed '1,2d' file | while read f1 f2; do 
    [ $f1 -lt 1000 ] && echo 1 
    [ $f1 -gt 1000 ] && echo 2 
done