2010-11-28 32 views
2

我是shell腳本新手。Shell腳本:如何從文件的每一行中選擇一個表達式的值

我具有包含以下形式的一些記錄的文件:

「文本1:文本2 =值2,文字3 =值3,文本4 = VALUE4,text5 =值5」 文本1:text6:value6" 「文本1:text2的= value2,text3 = value3,text4 = value4,text5 = value5「text1:text6:value6」 「text1:text2 = value2,text3 = value3,text4 = value4,text5 = value5」text1:text6:value6「 」text1 :text2 = value2,text3 = value3,text4 = value4,text5 = value5「text1:text6:value6」

現在我想編寫一個shell腳本來爲某些文本選擇值字段。 例如: 我想value2和value5,我知道他們將存在於text2 =和text5 =

也沒有整行的空白。該文件包含n行,我希望每行有2個值(即value2和value5),然後存儲在變量中以供進一步處理。

有人可以幫忙。

感謝

+0

你想命令行參數這次說'2&5'下次'3&4'?另外,每行的最後一部分看起來像'text5'之後的文本是'value5'text1:text6:value6「` - 是否正確? – 2010-11-28 15:45:16

回答

1

我敢肯定,一些更優雅的解決方案是可行的,但這個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

通過命令行的文本在q.text:

的gawk -F \」 '{打印$ 2}' < Q值。 txt | gawk -F:'{print $ 2}'| gawk -F,'{print $ 1'=「$ 4}'| gawk -F ='{print $ 2','$ 4}'

在Cygwin bash上嘗試過,它會工作。我不是程序員,但我使用cygwin shell,並認爲嘗試用gawk做這件事會很有趣。

2

使用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選項。它可能是醜陋的,但至少它不會在每一行被調用四次。

相關問題