0

我有一个包含 2 列的文件:键/值。

k1  v1
k2  v2
k3  v3
etc.

我正在尝试编写一个脚本来通过这个文件,拉出匹配的键/值供我测试。我的问题是我不知道如何拉出匹配集来运行我的测试。

我有两次失败的尝试,所以希望有人能指出我不正确的语法/逻辑并纠正我。

1)我尝试使用awk提取键和值并使用for循环进行处理

k=`awk '{print $1}' file`
v=`awk '{print $2}' file`

for i in {0..10}
do
   echo ${k[$i]}
   echo ${v[$i]}
done

但是,我不知道如何正确访问/存储这些值。一切都以数组的元素 0 结束。有没有办法在这个设置中指定,从 k 和 v 中获取“元素”0,从 k 和 v 中获取元素 1,等等从列表中串联?

2)我也尝试使用while循环来阅读这个

while read line
do
   k=`awk '{print $1}' $line`
   v=`awk '{print $2}' $line`
done < file

然而,这种技术似乎也是错误的,因为 shell 抱怨没有文件 kX 并说:

awk: cmd. line:1: fatal: cannot open file `k1' for reading (No such file or directory)
awk: cmd. line:1: fatal: cannot open file `k1' for reading (No such file or directory)
(repeating for all keys)

技术 #1 是我试图跳出框框思考来解决这个问题,尽管保持 2 个列表同步来完成这项工作似乎更难。我认为技巧#2对我来说更有意义

1) Read the line
2) Separate out the key and value
3) Use the key and value to run my test
4) Go to step 1 until EOF

希望有人可以帮助我解决我混乱的语法,或者教我一种比我正在做的更有效的新技术#3。

在此先感谢您的帮助。

4

1 回答 1

2

如果给 多个参数read,它将分割输入行并将每个变量分配给输入的相应字段。

while read k v
do 
  echo Key: $k
  echo Value: $v
done < file

如果输入字段多于变量,则最后一个变量获取所有剩余字段。

如果你写了,你的第一次尝试会奏效:

k=(`awk '{print $1}' file`)
v=(`awk '{print $2}' file`)

括号使它成为一个数组而不是单个值。

如果你写了,你的第二次尝试会奏效:

k=`echo "$line" | awk '{print $1}'`
v=`echo "$line" | awk '{print $2}'`

的第二个参数awk是文件名,而不是输入本身;您需要将该行通过管道传输到awk的标准输入。

于 2013-06-13T02:43:28.190 回答