您好,我有 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