我正在编写一个shell脚本,我必须在其中提取类型为的文件的内容:
TYPE1 |值a
类型2 | VALUEB
TYPE1 | valueC
类型2 |价值
类型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 :(得分:3)
您无需使用cat
。将某些内容放入while
会创建一个子shell。当子shell退出时,循环中设置的变量值将丢失(因为使用cd
作为目录更改的另一个例子。相反,您应该将文件重定向到done
:
while condition
do
# do some stuff
done < inputfile
顺便说一句,而不是:
while read record
你可以这样做:
while IFS='|' read -r column1 column2
答案 1 :(得分:2)
答案 2 :(得分: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 :(得分: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