2010-11-29 151 views
1

我正在寫一個shell腳本,在這裏我要提取文件,該文件是類型的內容超出這個值:的Unix shell腳本:從文件賦值給變量進入while循環,並使用循環

TYPE1 |值a
TYPE2 | VALUEB
TYPE1 | valueC
TYPE2 |價值
3型| valueE
....
力typen | valueZ。

對於column_1每種類型的,我有一個目標變量,它串接相同類型的值,以獲得這樣的結果:

VAR1 =值a,valueC
VAR2 = VALUEB ,價值
VAR3 = valueE
.....

腳本實現了這樣的事情:

var1="HELLO" 
var2="WORLD" 
... 
cat $file | while read record; do 
    #estract column_1 and column_2 from $record  
if [ $column_1 = "tipo1" ]; then 
    var1="$var1, column_2" ## column_2 = valueB 
elif .... 
.... 
fi 
done 

但是當我嘗試使用的任何變量在哪裏鏈column_2值:

echo "$var1 - $var2" 

我得到的原始值:

HELLO - WORLD.  

搜索互聯網,我請閱讀該問題與管道創建實際值被複制的子shell的事實有關。

有沒有辦法解決這個問題!?最重要的是,有一種方法可以適用於所有類型的shell,實際上,這個腳本必須運行在不同的shell上! 我不想使用文件支持來編寫部分結果。

回答

0

Oneliner:

for a in `awk "-F|" '{print $1;}' test | sort -u` ; do echo -n "$a =" ; grep -e "^$a" test | awk "-F|" '{ printf(" %s,", $2);}' ; echo "" ; done 
3

使用cat你不需要。將某些東西配成while會創建一個子外殼。當子shell退出時,循環中設置的變量值將丟失(如使用cd作爲另一個示例,則會進行目錄更改。相反,你應該重定向文件到done

while condition 
do 
    # do some stuff 
done < inputfile 

順便說一句,而不是:

while read record 

,你可以這樣做:

while IFS='|' read -r column1 column2 
0

用awk

awk '{a[$1]=a[$1]==""?$2:a[$1] OFS $2} 
END{for (i in a) print i"="a[i]}' FS=\| OFS=, file 

type1=valueA,valueC 
type2=valueB,valueD 
type3=valueE