awk
在使用 using格式化数据ARGV[1]
、使用withARGV[2]
连接数据方面需要帮助。awk
ARGV
文件1
sg_metro-ir
sg_metro-nonir
sg_optimized
sh_server1
sh_server2
sh_server3
sh_server4
文件2
vh_server1 ih_server1 sh_server1 E1-2_D1-4_P04_pg1
vh_server2 ih_server2 sh_server2 E1-2_D1-4_P05_pg2
vh_server3 ih_server3 sh_server3 E1-2_D1-4_P05_pg2
vh_server4 ih_server4 sh_server4 E1-2_D1-4_P04_pg1
输出
sg_metro-ir NOTFOUND
sg_metro-nonir NOTFOUND
sg_optimized NOTFOUND
sh_server1 vh_server1 ih_server1 sh_server1 E1-2_D1-4_P04_pg1
sh_server2 vh_server2 ih_server2 sh_server2 E1-2_D1-4_P05_pg2
sh_server3 vh_server3 ih_server3 sh_server3 E1-2_D1-4_P05_pg2
sh_server4 vh_server4 ih_server4 sh_server4 E1-2_D1-4_P04_pg1
我试图使用下面的逻辑。
VMAX_ALL_JOIN () {
awk '{
if (FILENAME==ARGV[0]) {a=$1;$1!="";sg_list[a]=$1}
if (FILENAME==ARGV[2] && $1!="") {print VAR_ARRAY_NAME, VAR_ARRAY_SNO, match(sg_list[$1],/[^ ]/) ? $0 : "NO_VIEW", $0,sg_list[$1]}
}
' file1 file2
}
VMAX_ALL_JOIN
我什至尝试过这个。
awk -F' ' -v OFS=' ' ' FNR==NR {f1[$1];next}; { if ($3 in f1) {print f1[$1], $0} else {print f1[$1], VIEW_NOT_FOUND} }' file1 file2
它只打印 file2 中找到的值,但我想如果找不到某些内容,则打印条件不存在。
答案1
以相反的方式处理文件,即首先读取并处理 file2,然后处理 file1:
awk 'FNR==NR { f2[$3]=$0; next };
{ print $0, ($1 in f2)? f2[$1]: "VIEW_NOT_FOUND" }' file2 file1
如果file2
可能为空,则您不能依赖FNR!=NR
第二个文件 ( file1
)。相反,你可以这样做:
awk '! file2_processed { f2[$3]=$0; next };
{ print $0, ($1 in f2) ? f2[$1]: "VIEW_NOT_FOUND" }
' file2 file2_processed=1 file1
一般来说,这比依赖于FNR==NR
知道您正在处理哪个文件是一个更安全的技巧(并且比FILENAME == ARGV[0]
一般情况下您应该编写的FILENAME == ARGV[1] ""
强制字符串比较更便宜,因为如果文件都是“类型”数字字符串) name 是一个数字;并注意第一个 arg 位于 中ARGV[1]
,而不是ARGV[0]
包含 awk 脚本的名称)。另请参阅ARGIND
GNU 的awk
:
awk 'ARGIND==1 { f2[$3]=$0; next };
{ print $0, ($1 in f2) ? f2[$1]: "VIEW_NOT_FOUND" }
' file2 file1
按照处理文件的方式(文件 1 先处理文件 2),您可能需要执行如下操作:
awk '! file1_processed { f1[$0]; next };
($3 in f1){ print $3, $0; delete f1[$3] }
END{ for(x in f1) print x, "VIEW_NOT_FOUND" }' file1 file1_processed=1 file2
首先打印匹配的行并从关联的数组中删除匹配的键f1
,然后在输出中打印不匹配的键,如下所示:
sh_server1 vh_server1 ih_server1 sh_server1 E1-2_D1-4_P04_pg1
sh_server2 vh_server2 ih_server2 sh_server2 E1-2_D1-4_P05_pg2
sh_server3 vh_server3 ih_server3 sh_server3 E1-2_D1-4_P05_pg2
sh_server4 vh_server4 ih_server4 sh_server4 E1-2_D1-4_P04_pg1
sg_metro-ir VIEW_NOT_FOUND
sg_metro-nonir VIEW_NOT_FOUND
sg_optimized VIEW_NOT_FOUND
答案2
for i in `cat file1`; do j=$(grep -i "$i" file2); if [[ $? != 0 ]]; then echo -e "$i Notfound"; else echo -e "$i $j"; fi; done
输出
sg_metro-ir Notfound
sg_metro-nonir Notfound
sg_optimized Notfound
sh_server1 vh_server1 ih_server1 sh_server1 E1-2_D1-4_P04_pg1
sh_server2 vh_server2 ih_server2 sh_server2 E1-2_D1-4_P05_pg2
sh_server3 vh_server3 ih_server3 sh_server3 E1-2_D1-4_P05_pg2
sh_server4 vh_server4 ih_server4 sh_server4 E1-2_D1-4_P04_pg1