2010-11-29 158 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