如何将一系列模式从 shell 脚本传递给 awk?

ayr*_*nna 0 solaris ksh awk

我有一系列存储在其中的模式foo.txt,我想遍历这些模式并查看 file 中的哪些匹配行bar.txt

while read PWW
do
   cat user/dump/bar.txt | awk '/${PWW}/{print $2}' >> user/dump/out.txt
done < user/dump/foo.txt
Run Code Online (Sandbox Code Playgroud)

foo.txt

2100001b32
2100001b38
3100001b35
4100001b28
5100001b46
6100001b56
Run Code Online (Sandbox Code Playgroud)

bar.txt

2100001b32 good
2100001b38 bad
3100001b35 okay
4100001b28 large
5100001b46 good
6100001b56 bad
Run Code Online (Sandbox Code Playgroud)

想要的out.txt

good
bad
okay
large
good
bad
Run Code Online (Sandbox Code Playgroud)

我无法搜索foo.txt. while 循环运行并给我空输出。我想awk${PWW}foo.txt.

我怎样才能让它工作?我的环境是 Solaris 5.10,使用 Korn shell,基本awk (旧awk)。

Joh*_*024 5

这是一个纯awk解决方案:

$ awk 'FNR==NR{a[$1]=$2; next} {print a[$1]}' bar.txt foo.txt
good
bad
okay
large
good
bad
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

该脚本首先读取 bar.txt 并将其信息保存在 array 中a。然后它读取 foo.txt 并打印出相应的值。

  • FNR==NR{a[$1]=$2; next}

    FNR 是从当前文件读取的行数,NR 是迄今为止读取的总行数。因此,如果FNR==NR,我们仍在读取第一个文件 (bar.txt)。如果是,a[$1]=$2则用于将条目添加到a保存这些值的数组中。然后,我们跳过脚本中的其余命令并重新开始next

  • print a[$1]

    如果我们到达这里,我们正在读取第二个文件 foo.txt。我们逐行读取 foo.txt。对于每一行,我们查找与第一列中的键对应的值并打印出来。