尝试使用 AWK 从一个文件中基于另一文件查找完整的字符串值

尝试使用 AWK 从一个文件中基于另一文件查找完整的字符串值

您好,我有 2 个文件,第一个文件包含一些值,例如

powershell
vectormaps
JuniperSA

第二个文件包含值 和 ID

appid uid
SplunkforSnort 340
powershell 610
vectormaps 729
JuniperSA 826
postfix 933
SplunkforJuniperSRX 929
TA-barracuda_webfilter 952
TA-dragon-ips 954
dhcpd 392

因此,我尝试使用 AWK 运行 while 循环来获取值及其相应的 ID,但输出文件似乎正在写入其他内容。这就是我尝试运行 while 循环的方式。

while read $line;
do
awk '/'$line'/ {print $0}' file2.csv > new
done < file1

我的预期输出应该是

powershell 610
vectormaps 729
JuniperSA 826

但我的输出是

appid uid
SplunkforSnort 340
powershell 610
vectormaps 729
JuniperSA 826
postfix 933
SplunkforJuniperSRX 929
TA-barracuda_webfilter 952
TA-dragon-ips 954
dhcpd 392

似乎什么也没有发生。我在这里缺少什么?

答案1

使用awk

$ awk 'FNR==NR {a[$1]=$2; next} {$(NF+1)=a[$1]}1' file2 file1
powershell 610
vectormaps 729
JuniperSA 826

答案2

如前所述,没有理由使用while循环,或者awk无论文件可能变得多么复杂。您只是想打印第二个文件中包含第一个文件中的字符串的行。最好使用 KISS 方法,而不是在不必要的地方使事情复杂化。

以下将做你想做的事:

grep -f file1 file2.csv

答案3

在 shell 中设置变量时不得使用 $ 符号。另外 awk 不能使用 shell 变量,你必须将它们传递给 awk-v variable=value

while read line;
do 
awk -v line="$line" -e '{if  ($1 ~ line) print $0} ' file2.csv
done < file1 >new

相关内容