2017-11-27 6 views
1

파일 경로가 들어있는 두 개의 파일이 있습니다.linux bash - 두 파일을 비교하고 같은 결말을 가진 중복 행을 제거하십시오.

파일 1

/home/anybody/proj1/hello.h 
/home/anybody/proj1/engine.h 
/home/anybody/proj1/car.h 
/home/anybody/proj1/tree.h 
/home/anybody/proj1/sun.h 

파일이 아마 GREP을 사용하여 명령을 필요

/home/anybody/proj2/module/include/cat.h 
/home/anybody/proj2/module/include/engine.h 
/home/anybody/proj2/module/include/tree.h 
/home/anybody/proj2/module/include/map.h 
/home/anybody/proj2/module/include/sun.h 

, 그 두 개의 파일을 출력 두 파일의 조합을 비교,하지만의 경우 것 파일 이름과 중복되면 파일 2에서 파일을 보관하십시오.

예상 출력 :

/home/anybody/proj1/hello.h 
/home/anybody/proj1/car.h 
/home/anybody/proj2/module/include/cat.h 
/home/anybody/proj2/module/include/engine.h 
/home/anybody/proj2/module/include/tree.h 
/home/anybody/proj2/module/include/map.h 
/home/anybody/proj2/module/include/sun.h 

이것은 내 프로젝트의 태그 데이터베이스에 대한 포함 파일 목록을 생성 할 수 있기 때문에 일부 파일은 빌드에 의해 복제되며 내 데이터베이스에 동일한 파일의 사본이 두 개있는 것을 원하지 않습니다.

답변

2

awk 명령은 일을해야 수행해야합니다

awk -F/ 'NR == FNR{a[$NF]=$0; next} !($NF in a); END{for (i in a) print a[i]}' file2 file1 

/home/anybody/proj1/hello.h 
/home/anybody/proj1/car.h 
/home/anybody/proj2/module/include/map.h 
/home/anybody/proj2/module/include/cat.h 
/home/anybody/proj2/module/include/engine.h 
/home/anybody/proj2/module/include/tree.h 
/home/anybody/proj2/module/include/sun.h 
+0

이것은 줄 바꿈을 포함합니다 !! – SriniV

+0

당신이 그 의미를 명확히 할 수 있습니까? 이것은 제공된 샘플 데이터에 따른 것입니다. – anubhava

+1

잘 작동합니다. 감사합니다. – Percee

1

이것은

cat file2 file1 | awk -F '/' ' 
{ if (a[$NF] == "") a[$NF] = $0 } 
END { for (k in a) print a[k] }' | sort 
+0

데이터가 내 스크립트를 확장 – SriniV

+0

을 정렬되지 않습니다. 하지만 대개 데이터베이스는 정렬되지 않은 데이터를 처리 할 수 ​​있습니다 – Ronald

+1

고마워요, 그게 – Percee