2013-07-30 1 views
0

두 파일 (을 사용할 수 없음)을 fileafileb으로 정렬하고 싶지 않습니다. 셸 스크립트를 사용하여 두 파일을 정렬하지 않고 비교하십시오.

filea fileb 
cat  cat 
dog  elephant 
cat  snake 
rabbit pony 

filea의 내용이 다음 파일의 내용이 다른과 파일 2가 뱀, 다음 sna를 표시하면 코끼리 다음, ele 표시가 포함되어있는 경우, fileb에 어떤 표시 fileb의 것과 동일하면

, 조랑말 경우 pon을 표시하십시오.

나는 cmp를 사용하여 시도 :

if cmp -s filea fileb 
then echo $"fileb" 
fi 

하지만 아무것도 표시되지 않았다. 출력을 세 번째 파일의 열에 넣기를 원합니다.

답변

0

AFAICR, cmp은 파일이 동일하면 true를 반환합니다. 따라서 if 문장에 아무것도 인쇄되지 않았다는 것은 놀라운 일이 아닙니다. 파일이 다릅니다. 차이의 단지 처음 3 개 문자를

$ awk 'FNR==NR{a[$0];next}!($0 in a)' filea fileb 
elephant 
snake 
pony 

인쇄 : 정렬 중 파일없이

if cmp -s filea fileb 
then cat fileb 
else 
    { 
    grep elephant fileb 
    grep snake fileb 
    grep pony fileb 
    } | 
    sed 's/\(...\).*/\1/' 
fi 
+0

당신의 SED 구문을 설명 할 수 있습니까? 감사합니다. – t28292

+0

'sed' 명령은 3 문자 (처음 3 문자)를 기억하고 그 행의 여분의 문자와도 일치하지만 기억 된 것만으로 전체를 대체합니다. –

0

awk를 사용 : 당신은 file2에 세 단어를 발견하고 단지 세 문자로 자릅니다 else 절을 필요 :

$ awk 'FNR==NR{a[$0];next}!($0 in a){print substr($0,1,3)}' filea fileb 
ele 
sna 
pon 

OUPUT 새 파일을 사용 리디렉션에있을 경우 :

$ awk 'FNR==NR{a[$0];next}!($0 in a){print substr($0,1,3)}' filea fileb > filec 

편집 : 그것은 filea와 같은인지

FNR==NR  # Are we looking at the first file 
a[$0]   # If so build an associative array of the file 
next   # Go get the next line in the file 
!($0 in a) # In the second file now, check if the current line is in the array 
print sub... # If not print the first 3 characters from the current line 
+0

단계를 설명해 주시겠습니까? – t28292

+0

@ user2613272 편집을 참조하십시오. –

2

당신은 fileb을 인쇄 할 것으로 보인다. 이들이 다르면 filea에없는 행의 처음 3자를 인쇄하려고합니다. 당신을 위해 다음과 같은 작업을해야합니다 :

$ cmp -s filea fileb && cat fileb || { grep -v -f filea fileb | cut -c-3; } 
ele 
sna 
pon 

(위의 구절을 읊었 질문은, 참으로, 위의 표현에 대한 설명입니다.) 어떻게 작동하는지

+1

유닉스 철학 +1의 좋은 시연. –

+0

grep -f : 표시되는 내용이 잘못된 옵션 – t28292

+1

@ user2613272 어떤 플랫폼을 사용하고 있습니까? 사용중인'grep '버전이'-f'를 지원하지 않는 것 같습니다. 솔라리스에 있다면,이 옵션을 지원하는'/ usr/xpg4/bin/grep' 버전이있을 것입니다. – devnull