shell脚本,根据字符串获取行号的
在文件A里根据行号获取到一个字符串,怎么根据这个字符串去文件B里面获取行号。我按下面这么写的,不行typetmp=`cat$paratmppath|awk"NR==$li...
在文件A里根据行号获取到一个字符串,怎么根据这个字符串去文件B里面获取行号。
我按下面这么写的,不行
typetmp=` cat $paratmppath | awk "NR==$line" | cut -d ":" -f1`
typeline=`cat $typepath | awk '/"$typetmp"/{print NR}'`
paratmppath文件里文本是
ts:ts
mp4:mp4
这样的。
typepath文件里文本是
ts
mp4
这样的。 展开
我按下面这么写的,不行
typetmp=` cat $paratmppath | awk "NR==$line" | cut -d ":" -f1`
typeline=`cat $typepath | awk '/"$typetmp"/{print NR}'`
paratmppath文件里文本是
ts:ts
mp4:mp4
这样的。
typepath文件里文本是
ts
mp4
这样的。 展开
2个回答
展开全部
awk中不能解析shell变量,建议做法是通过-v传递进去:
typeline=`cat $typepath | awk -v str="$typetmp" '/str/{print NR}'`
第一句之所以在awk中可以直接使用shell变量$line,是因为用的双引号。
从执行效率上来说,你的写法其实太过累赘,下面是改良版:
typetmp=`awk -F":" -v n=$line 'NR==n{print $1}' $paratmppath`
typeline=`sed -n '/'"$typetmp"'/=' $typepath`
这里用sed来获取行号。
第一句,cut能做的awk也能做,直接在一个awk里完成就行。
awk和sed本身就是直接对文件的处理,用不着先cat再通过管道传递过来处理。
"$typetmp"前面的单引号用于跟一开始的单引号凑成一对,关闭sed作用域回到shell环境中,使得shell可以解析此变量,然后重新用单引号再次进入sed作用域。等于将sed作用域从中间分割开了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询