2015-01-23 2 views
-1

두 개의 데이터 파일이 있는데 이렇게 보일 수 있습니다.두 개의 서로 다른 파일 비교

A dog 3 
A cat 1 
A mouse 4 
A chicken 4 

B tiger 2 
B chicken 1 
B dog 3 
B wolf 2 

어떻게 두 파일에 공통되는 동물에서 볼 수있을 것? 이상적으로, 나는 출력이

dog 3 3 
chicken 4 1 

그러나 심지어 두 파일에 공통의 가치와 함께 단지 사람을 출력하는 나를 위해 충분 같은 것을보고 싶습니다. 감사.

+1

무엇이'A'와'B'입니까? 공백을 포함하지 않는 문자열입니까? 고정 폭 또는 가변? – lurker

+0

그들은 실험의 일부로 측정 된 다른 값이지만 내 분석에는별로 중요하지 않습니다. 공백은 없지만 고정 폭은 없습니다. – Gavin

+0

이것은 숙제 문제처럼 들립니다 :) –

답변

0

왜 이것이 리눅스/유닉스 질문인지 잘 모르겠습니다. Beyond Compare와 같은 응용 프로그램에서 일반적으로 다루는 기본 2 파일 비교 문제가 아니기 때문에 필요한 프로그램이 필요합니다.

이 파일은 공백으로 구분 된 값을 사용하여 한 줄에 하나의 레코드가 들어있는 기본 텍스트 파일이라고 가정 해 보겠습니다. 구분 기호가 위험하므로 공간을 사용하십시오.하지만 위의 내용을 참조하십시오. 두 파일을 [iterable collection]으로 저장하고 각 루프가 실행될 때마다 작동하는 문자열이거나 파일에서 빌드 할 때 조각으로 분해되는 문자열을 각 파일에 저장해야합니다 . 두 번째 파일에서 첫 번째 파일의 [linepart 1]과 두 번째 파일의 [linepart 1]을 비교해야하며 일치하는 항목을 발견 할 때마다 [linepart 1] [A.linepart 2] [B.linepart 2 ].

내가 당신을 위해 이런 짓을 했을까 기존 프로그램 생각할 수 없다, 그러나 그것은 매우 간단 등

1

이 한 줄 자바, C#을 취급하는 (가정 당신은 파일 IO는 간단하다 생각) @Kent는 진지한 한 줄의 마법을 저지른 적이 있습니다 :

awk 'NR==FNR{a[$2]=$2 FS $3;next}a[$2]{print a[$2],$3}' f1 f2 
1

어쨌든 시도해 볼 수있는 쉘 스크립트를 만들었습니다. 간단히 실행하십시오 ./script[file1] [file2]

#!/bin/bash 

# Read input 
words1=$(cat $1 | sed -r "s/.*\ (.*)\ .*/\1/") 
val1=$(cat $1 | sed -r "s/.*\ .*\ (.*)/\1/") 
words2=$(cat $2 | sed -r "s/.*\ (.*)\ .*/\1/") 
val2=$(cat $2 | sed -r "s/.*\ .*\ (.*)/\1/") 

# Convert to array 
words1=($words1) 
val1=($val1) 
words2=($words2) 
val2=($val2) 

# Iterate and print result 
for i in "${!words1[@]}"; do 
    for j in "${!words2[@]}"; do 
     if [ ${words1[i]} == ${words2[j]} ]; then 
      echo "${words1[i]} ${val1[i]} ${val2[j]}" 
      break 
     fi 
    done 
done 

exit 0 
관련 문제