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

비어 있을 가능성이 있는 경우 두 번째 파일( ) 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

답변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

관련 정보