Shell Scripting: как выбрать значение выражения из каждой строки файла - PullRequest
2 голосов
/ 28 ноября 2010

Я новичок в написании сценариев оболочки.

У меня есть файл, содержащий некоторые записи вида:

"text1: text2 = значение2, text3 = value3, text4 = value4, text5 = value5" text1: text6: value6" "Text1: text2 = значение2, text3 = value3, text4 = value4, text5 = value5" text1: text6: value6" "Text1: text2 = значение2, text3 = value3, text4 = value4, text5 = value5" text1: text6: value6" "Text1: text2 = значение2, text3 = value3, text4 = value4, text5 = value5" Текст1 text6: value6"

Теперь я хочу написать сценарий оболочки, который выбирает поле значения для некоторого текста. Например: Мне нужны значения2 и значения5, и я знаю, что они будут существовать перед text2 = и text5 =

Также в пустой строке нет пробелов. Файл содержит n строк, и я хочу иметь по 2 значения из каждой строки (т.е. value2 и value5) и сохранять их в переменных для дальнейшей обработки.

Может кто-нибудь помочь.

Спасибо

Ответы [ 3 ]

2 голосов
/ 28 ноября 2010

Использование sed:

while read text2var text5var
do
    #something with text2var and text5var
done < sed 's/.*:text2=\([^,]*\),.*,text5=\([^"]*\)".*/\1 \2/') inputfile

Использование GNU AWK (gawk):

while read text2var text5var
do
    #something with text2var and text5var
done < gawk -F ',|:|"' '{sub("[^=]*=","",$3); sub("[^=]*=","",$6); print $3, $6}' inputfile

Чтобы использовать другие версии AWK, у которых нет регулярных выражений для разделителей полей, используйте регулярное выражение, похожее на команду sed, или используйте много разбиений:

while read text2var text5var
do
    #something with text2var and text5var
done < awk -F ',' '{split($1,t2,"text2="); split($4,t5,"\""); split(t5[1],t5,"="); print t2[2], t5[2]}' inputfile

Использование cut:

while read text2var text5var
do
    #something with text2var and text5var
done < cut -d , -f 1,4 --output-delimiter='=' inputfile | cut -d '"' -f2 | cut -d = -f1,3 | cut -d : -f 2 | cut -d = --output-delimiter=' ' -f1,2 

GNU cut может потребоваться для использования опции --output-delimiter. Это может быть некрасиво, но по крайней мере это не вызывается четыре раза в каждой строке.

1 голос
/ 28 ноября 2010

Я уверен, что возможно более элегантное решение, но этот bash-скрипт просто перебирает ввод и отфильтровывает

  • значение между первым = и следующими , и
  • значение между четвертым = и следующим ":

    while read line
    do
        value2=`echo "$line" | cut -d = -f 2 | cut -d , -f 1`
        value5=`echo "$line" | cut -d = -f 5 | cut -d \" -f 1`
        echo $value2 - $value5   # do something with $value2 and $value5
    done
    

Вы называете сценарий так:

bash myscript.sh < mytextfile.txt
0 голосов
/ 28 ноября 2010

Из командной строки с текстом в q.text:

gawk -F \ "'{print $ 2}' Пробовал на Cygwin bash, и это будет работать. Я не программист, но я используюcygwin shell и подумал, что было бы интересно попробовать сделать это с gawk.

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