需要帮助使用 awk 使用 ARGV[1]、ARGV[2] 格式化数据

需要帮助使用 awk 使用 ARGV[1]、ARGV[2] 格式化数据

awk在使用 using格式化数据ARGV[1]、使用withARGV[2] 连接数据方面需要帮助。awkARGV

文件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 脚本的名称)。另请参阅ARGINDGNU 的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

相关内容