awk
データ型の指定に使用しARGV[1]
、ARGV[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
空の可能性がある場合、2番目のファイル()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]
作成する必要があるawkスクリプトの名前を含まずFILENAME == ARGV[1] ""
にあります)。 GNUも参照してください:ARGV[1]
ARGV[0]
ARGIND
awk
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
答え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