ARGV [1]、ARGV [2]を使用してデータ型を指定するためにawkを使用するのに役立ちます。

ARGV [1]、ARGV [2]を使用してデータ型を指定するためにawkを使用するのに役立ちます。

awkデータ型の指定に使用しARGV[1]ARGV[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

空の可能性がある場合、2番目のファイル()file2は信頼できません。代わりに、次のようにすることができます。FNR!=NRfile1

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]作成する必要があるawkスクリプトの名前を含まずFILENAME == ARGV[1] ""にあります)。 GNUも参照してください:ARGV[1]ARGV[0]ARGINDawk

awk 'ARGIND==1 { f2[$3]=$0; next };
     { print $0, ($1 in f2) ? f2[$1]: "VIEW_NOT_FOUND" }
    ' file2 file1

ファイルの処理方法(ファイル1が最初に処理される)によっては、次のことが必要になる場合があります。

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

おすすめ記事