두 파일을 비교하고 필요한 내용을 세 번째 파일로 출력하는 방법

두 파일을 비교하고 필요한 내용을 세 번째 파일로 출력하는 방법

2개의 입력 파일이 있습니다.

파일 1의 내용은 ( file1)입니다.

"BRGTEST-242" a.txt
"BRGTEST-240" a.txt
"BRGTEST-219" e.txt

파일 2의 내용은 ( file2)입니다.

"BRGTEST-244" a.txt
"BRGTEST-244" b.txt
"BRGTEST-231" c.txt
"BRGTEST-231" d.txt
"BRGTEST-221" e.txt

최종 출력을 ( )로 얻고 싶습니다 file3.

BRGTEST-244 is depdendent on BRGTEST-242 for file a.txt    
BRGTEST-244 is depdendent on BRGTEST-240 for file a.txt    
BRGTEST-221 is dependent on BRGTEST-219 for the file e.txt 

쉘 스크립트 로직을 작성하는 방법은 무엇입니까? 사용해 보았지만 awk원하는 결과를 얻을 수 없었습니다.

답변1

다차원 배열을 지원하는 GNU Awk(gawk)를 사용하면 논리는 다음과 같습니다.

gawk '
  NR==FNR {
    a[$2][++c[$2]] = $1; next
  } 
  $2 in a {
    for (i in a[$2]) 
      print $1 " is dependent on " a[$2][i] " for " $2
  }
' File1 File2
"BRGTEST-244" is dependent on "BRGTEST-242" for a.txt
"BRGTEST-244" is dependent on "BRGTEST-240" for a.txt
"BRGTEST-221" is dependent on "BRGTEST-219" for e.txt

따옴표도 제거해야 하는 경우:

gawk '
  NR==FNR {
    a[$2][++c[$2]] = substr($1,2,length($1)-2); next
  } 
  $2 in a {
    for (i in a[$2]) 
      print substr($1,2,length($1)-2) " is dependent on " a[$2][i] " for " $2
  }
' File1 File2
BRGTEST-244 is dependent on BRGTEST-242 for a.txt
BRGTEST-244 is dependent on BRGTEST-240 for a.txt
BRGTEST-221 is dependent on BRGTEST-219 for e.txt

답변2

이것이 당신이 원하는 것입니다:

#!/bin/bash

while read line1; do
  f21=$(echo $line1 | cut -d" " -f1)
  f22=$(echo $line1 | cut -d" " -f2)
  #echo "outside: $f21 -- $f22"

  while read line2; do
    f11=$(echo $line2 | cut -d" " -f1)
    f12=$(echo $line2 | cut -d" " -f2)
    #echo "inside: $f11 -- $f12"

    if [ "$f22" == "$f12" ]; then
      echo "$f21 is dependent on $f11 for file $f22"
    fi

  done < file1
done < file2

./parsy.bash
"BRGTEST-244" is dependent on "BRGTEST-242" for file a.txt
"BRGTEST-244" is dependent on "BRGTEST-240" for file a.txt
"BRGTEST-221" is dependent on "BRGTEST-219" for file e.txt

어떻게 작동하나요?

echo ...이 스크립트에는 주석 처리를 제거하여 스크립트가 다른 2개 파일을 어떻게 처리하는지 시각적으로 확인할 수 있는 2개의 명령을 남겼습니다 . 주석을 제거하면 다음과 같은 출력이 표시됩니다.

$ ./parsy.bash | head -10
outside: "BRGTEST-244" -- a.txt
inside: "BRGTEST-242" -- a.txt
"BRGTEST-244" is dependent on "BRGTEST-242" for file a.txt
inside: "BRGTEST-240" -- a.txt
"BRGTEST-244" is dependent on "BRGTEST-240" for file a.txt
inside: "BRGTEST-219" -- e.txt
outside: "BRGTEST-244" -- b.txt
inside: "BRGTEST-242" -- a.txt
inside: "BRGTEST-240" -- a.txt
inside: "BRGTEST-219" -- e.txt

이를 수행하는 핵심은 반복해야 할 내용을 인식 file2하고 기준에 따라 각 요소가 해당 내용과 일치하는지 확인하는 것입니다 file1. 이렇게 하려면 다른 루프 안에 루프를 중첩해야 합니다.

이 구조와 이에 따라 데이터가 구문 분석되면 간단한 명령문을 사용하여 if두 번째 열이 일치하는지 확인할 수 있으며, 그렇다면 수집한 조각을 사용하여 메시지를 보냅니다.file1file2echo

관련 정보