我是shell脚本的新手。
我有一个包含表格记录的文件:
“文本1:文本2 =值2,文字3 =值3,文本4 = VALUE4,text5 =值5” 文本1:text6:value6" “文本1:文本2 =值2,文字3 =值3,文本4 = VALUE4,text5 =值5” 文本1:text6:value6" “文本1:文本2 =值2,文字3 =值3,文本4 = VALUE4,text5 =值5” 文本1:text6:value6" “文本1:文本2 =值2,文字3 =值3,文本4 = VALUE4,text5 =值5” 文本1:text6:value6"
现在我想编写一个shell脚本来获取某些文本的值字段。 例如: 我想要value2和value5,我知道它们将存在于text2 =和text5 =
之前整条线上也没有空白。该文件包含n行,我希望每行有2个值(即value2和value5),然后存储在变量中以供进一步处理。
有人可以提供帮助。
谢谢
答案 0 :(得分: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
选项。它可能很难看,但至少在每一行都没有被召唤四次。
答案 1 :(得分: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
答案 2 :(得分:0)
在命令行中使用q.text中的文本:
gawk -F \“'{print $ 2}'&lt; q.txt | gawk -F:'{print $ 2}'| gawk -F,'{print $ 1”=“$ 4}'| gawk -F = '{print $ 2“,”$ 4}“
尝试使用Cygwin bash,它会起作用。我不是程序员,但我使用cygwin shell,并认为用gawk尝试这样做会很有趣。