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