file1의 각 행을 file2의 각 행과 비교합니다.

file1의 각 행을 file2의 각 행과 비교합니다.

2개의 파일이 있습니다.

c1 로그

D1W /u02/app/oracle/db/ggs/current/dirdat/fe
D2W /u02/app/oracle/db/ggs/current/dirdat/ff

c2 로그

E1W /u02/app/oracle/db/ggs/current/dirdat/fe
E2W /u02/app/oracle/db/ggs/current/dirdat/fe
E3W /u02/app/oracle/db/ggs/current/dirdat/fe
F1W /u02/app/oracle/db/ggs/current/dirdat/ff
F2W /u02/app/oracle/db/ggs/current/dirdat/ff
F3W /u02/app/oracle/db/ggs/current/dirdat/ff
F4W /u02/app/oracle/db/ggs/current/dirdat/ff

c1.log의 각 행의 두 번째 열과 c2.log의 각 행의 두 번째 열을 비교해야 합니다. 일치하면 출력을 한 줄로 인쇄해야 합니다.

D1W /u02/app/oracle/db/ggs/current/dirdat/fe    E1W /u02/app/oracle/db/ggs/current/dirdat/fe

또한 출력은 새 파일에 기록되어야 합니다. c3.log를 가정하면 도와주세요.

고마워요 모세

답변1

나는 이것을 수행하는 간단한 Python 스크립트를 작성했습니다.

address1 = input("Enter first file address:\n")
address2 = input("Enter second file address:\n")

data1 = []
data2 = []
with open(address1) as file:
    data1 = file.read().split('\n')

with open(address2) as file:
    data2 = file.read().split('\n')

if data1[-1] == "": data1.pop()
if data2[-1] == "": data2.pop()

for i in data1:
    for j in data2:
        if i.split(' ')[1].strip() == j.split(' ')[1].strip():
            print(i + ' ' + j)

답변2

join당신을 위해 대부분의 작업을 수행할 수 있습니다. 다음과 같이 두 번째 필드에서 일치하는 두 파일의 일치하는 줄을 연결합니다.

$ join -j 2 c1.log c2.log
/u02/app/oracle/db/ggs/current/dirdat/fe D1W E1W
/u02/app/oracle/db/ggs/current/dirdat/fe D1W E2W
/u02/app/oracle/db/ggs/current/dirdat/fe D1W E3W
/u02/app/oracle/db/ggs/current/dirdat/ff D2W F1W
/u02/app/oracle/db/ggs/current/dirdat/ff D2W F2W
/u02/app/oracle/db/ggs/current/dirdat/ff D2W F3W
/u02/app/oracle/db/ggs/current/dirdat/ff D2W F4W

그러면 일치 항목과 c1 및 c2의 첫 번째 열이 제공됩니다. 조인을 위해서는 입력 파일을 정렬해야 합니다. 그렇지 않은 경우 즉시 정렬할 수 있습니다
join -j2 <(sort c1.log) <(sort c2.log). 이것은 쉘 마법입니다. <( some command )파일 join이나 파일이 필요한 다른 명령처럼 보입니다.

이를 추가로 처리해 보겠습니다.

$ join -j 2 c1.log c2.log | while read match c1 c2; do printf '%s %s\t%s %s\n' $c1 $match $c2 $match; done
D1W /u02/app/oracle/db/ggs/current/dirdat/fe    E1W /u02/app/oracle/db/ggs/current/dirdat/fe
D1W /u02/app/oracle/db/ggs/current/dirdat/fe    E2W /u02/app/oracle/db/ggs/current/dirdat/fe
D1W /u02/app/oracle/db/ggs/current/dirdat/fe    E3W /u02/app/oracle/db/ggs/current/dirdat/fe
D2W /u02/app/oracle/db/ggs/current/dirdat/ff    F1W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff    F2W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff    F3W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff    F4W /u02/app/oracle/db/ggs/current/dirdat/ff

완벽한!

다음은 필요한 경우 스크립트에 붙여 넣을 수 있도록 조심스럽게 래핑된 명령입니다.

join -j 2 c1.log c2.log \
| while read match c1 c2; do 
  printf '%s %s\t%s %s\n' "$c1" "$match" "$c2" "$match"
done

두 부분 사이에 라벨이 필요하지 않은 경우@bu5hman이 더 나은 답변을 가지고 있습니다.

고쳐 쓰다:
조인을 사용하여 탭 문자를 삽입할 수도 있습니다. join -t' ' -j2 -o 1.1 1.2 2.1 2.2 <(sort c1.log) <(sort c2.log) 다음 공백은 -t'리터럴 탭 문자입니다. Ctrl+V를 누른 다음 Tab 키를 누릅니다. 또한 파일을 인라인으로 정렬하고 있습니다.

$ join -t'      ' -j2 -o 1.1 1.2 2.1 2.2 <(sort c1.log) <(sort c2.log)
D1W /u02/app/oracle/db/ggs/current/dirdat/fe        E1W /u02/app/oracle/db/ggs/current/dirdat/fe    
D1W /u02/app/oracle/db/ggs/current/dirdat/fe        E2W /u02/app/oracle/db/ggs/current/dirdat/fe    
D1W /u02/app/oracle/db/ggs/current/dirdat/fe        E3W /u02/app/oracle/db/ggs/current/dirdat/fe    
D1W /u02/app/oracle/db/ggs/current/dirdat/fe        F1W /u02/app/oracle/db/ggs/current/dirdat/ff    
D1W /u02/app/oracle/db/ggs/current/dirdat/fe        F2W /u02/app/oracle/db/ggs/current/dirdat/ff    
D1W /u02/app/oracle/db/ggs/current/dirdat/fe        F3W /u02/app/oracle/db/ggs/current/dirdat/ff    
D1W /u02/app/oracle/db/ggs/current/dirdat/fe        F4W /u02/app/oracle/db/ggs/current/dirdat/ff    
D2W /u02/app/oracle/db/ggs/current/dirdat/ff        E1W /u02/app/oracle/db/ggs/current/dirdat/fe    
D2W /u02/app/oracle/db/ggs/current/dirdat/ff        E2W /u02/app/oracle/db/ggs/current/dirdat/fe    
D2W /u02/app/oracle/db/ggs/current/dirdat/ff        E3W /u02/app/oracle/db/ggs/current/dirdat/fe    
D2W /u02/app/oracle/db/ggs/current/dirdat/ff        F1W /u02/app/oracle/db/ggs/current/dirdat/ff    
D2W /u02/app/oracle/db/ggs/current/dirdat/ff        F2W /u02/app/oracle/db/ggs/current/dirdat/ff    
D2W /u02/app/oracle/db/ggs/current/dirdat/ff        F3W /u02/app/oracle/db/ggs/current/dirdat/ff    
D2W /u02/app/oracle/db/ggs/current/dirdat/ff        F4W /u02/app/oracle/db/ggs/current/dirdat/ff

답변3

또는 파일이 정렬되어 있다고 가정합니다.-k2

join -j2 -o 1.1 1.2 2.1 2.2 c1.log c2.log

산출:

D1W /u02/app/oracle/db/ggs/current/dirdat/fe E1W /u02/app/oracle/db/ggs/current/dirdat/fe
D1W /u02/app/oracle/db/ggs/current/dirdat/fe E2W /u02/app/oracle/db/ggs/current/dirdat/fe
D1W /u02/app/oracle/db/ggs/current/dirdat/fe E3W /u02/app/oracle/db/ggs/current/dirdat/fe
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F1W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F2W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F3W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F4W /u02/app/oracle/db/ggs/current/dirdat/ff

답변4

이는 c1.log, c2.log 및 다음 스크립트가 동일한 디렉터리에 존재한다고 가정하여 작동합니다.

while read i
do
 c1_array=( $i )
 string1=${c1_array[1]}
 while read j
 do
   c2_array=( $j )
   string2=${c2_array[1]}
   if [ $string1 = $string2 ]
   then
    echo "$i    $j"
   fi
 done < c2.log
done < c1.log

관련 정보