shell 脚本 while read a b c d ;do done语句中 a b 的值于最外层不一致

while read a b c d
do
echo $a,$b
awk -F" " '{if($1==$a && $2==$b){print $1;}print $a,22}' ./data/1/statusl.txt
echo 1
done<./data/1/statusl.txt
echo hey!
输入文件的每行是335 1 2 00
$a=335 $b=1 $c=2 $d=00
但在do done的awk语句里面
$a=335 1 2 00
怎么改能让在do done的awk语句里面 $a=335 $b=1??

while循环一次只读一行,直至读到文件末尾。你试试下面这个:
while read line
do
echo "$line"
done <./data/1/statusl.txt

就会打印:
335
1
2
00

你要把每行取出来分别赋给一个变量的话,用sed 或 head 即可。
a=`sed -n '1p' ./data/1/statusl.txt`
b=`sed -n '2p' ./data/1/statusl.txt`
或者
a=`head -n 1 ./data/1/statusl.txt`
b=`head -n 2 ./data/1/statusl.txt`

而且上面的awk语句也有错误,把$a,$b放在单引号里面会被认为是awk的变量,不会被shell解析并替换成对应的值的。需要拿到单引号外面来(在$a前关闭单引号,$a之后再打开;$b同样处理)。并且,awk默认的字段分隔符就是空格,所以没必要再用 -F 指定。
修改如下:
awk '{if($1==‘$a’ && $2==‘$b’){print $1;}print ‘$a’,22}' ./data/1/statusl.txt

最后,实在不知道你要干什么。因为awk本身就会读文件,而且也是一行一行地读。
statusl.txt 只有1列,以空格作为分隔符,只能得到一个字段($1),$2不存在。 所以,上面我改的那句其实也是不对的。追问

非常感谢
我原本的意图是从./data/1/statusl.txt中读到每一行的前两列(这个文件中每行有四列 while read a b c d 将会读到每行的四列的值 以空白符作分隔) 再在另一个文件中匹配相同的一行 (awk语句用到另一个文件 我写错文件名) 多次匹配
修改如下:
awk '{if($1==‘$a’ && $2==‘$b’){print $1;}print ‘$a’,22}' ./result/1/statusl.txt
这样就可以达到我的目的了

如果有更好的方法希望你能提出来
thanks

追答

两个不同的文件比较,直接用 awk 也可以做到。你这个是相同行比较前两列,比较容易做到,因为awk就是以行为单位操作的。要不你先参考一下我的另一个回答:
http://zhidao.baidu.com/question/198984043.html
不明白的再补充提问。Ok?
提示一下,要用到awk的一些内置变量,如NR (Number of Record),FNR (Number of Record in File)。区别就是,NR是不区分文件累加,而FNR只针对当前文件累加。
先读完一个文件,用数组a[]和b[]分别保存其所有字段1和字段2的值;再按行读另一个文件时,对每行用$1和$2与对应a[]和b[]的值比较。一个语句可以实现。
不过,还是你原来的方法更加便于理解和维护。

追问

看了 我理解的应该是跟你说的一样的 可以说NR==FNR{} 对应file2来执行 NR>FNR{}对应file1来执行对吧?
我原来的可以用 但速度不够
我把我的改成了
awk
'{if($3!=3){a[FNR]=$1;b[FNR]=$2;c=FNR}}
for(i=1;i./result/1/alldiff.txt
不知道哪里错了

追答

NR==FNR的时候操作第一个文件,把file1的两个字段分别以数组形式保存;
操作第二个文件的时候,FNR从1开始重新计数,而NR继续累积,此时NR>FNR。
还是不知道你具体要做什么操作。./data/1/Qll.txt 这个文件干嘛用的?
反正,必须要通过 NR 与 FNR 的关系来判断当前操作的文件。这个格式是不变的:
awk 'NR==FNR{......}NR>FNR{......}' file1 file2 > result

追问

awk
'NR==FNR{if($3!=3){a[FNR]=$1;b[FNR]=$2;c=FNR}}
NR>FNR{for(i=1;i./result/1/alldiff.txt
这样应该是对的 但是语法错误
./b.sh: line 8: NR==FNR{if($3!=3){a[FNR]=$1;b[FNR]=$2;c=FNR}}
NR>FNR{for(i=1;i<=c;i++)
{if($1==a[i]&&$2==b[i])
{print $1;break;}
}}: command not found

追答

为什么要判断 if($3!=3)??
就因为你这个判断条件,有些行符合要求,有些行不符合要求,而FNR无论如何都会累加的,这就导致 a[FNR] 和 b[FNR] 数组下标不连续。所以后面 for 循环从第1行到第c行依次比较的时候,有些数组元素是没有初始化的。
你这个顺序就是,先操作文件 ./data/1/statusl.txt,再操作文件./data/1/Qll.txt。
我始终搞不清楚你的具体需求。有问题 百度hi 上加我吧,在这里回帖效率太低下了。

来自:求助得到的回答
温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网