두 개의 파일이 있습니다.
smw:/working/iso_testing # cat a
QConvergeConsoleCLI-1.1.03-49.x86_64.rpm
aaa_base-13.2+git20140911.61c1681-1.3.i586.rpm
acpica-20140724-2.1.2.i586.rpm
test.rpm
그리고
smw:/working/iso_testing # cat b
QConvergeConsoleCLI-1.1.03-49.x86_64.rpm
aaa_base-13.2+git20140911.61c1681-1.3.i586.rpm
acpica-20140724-2.1.2.i586.rpm
--비교하면 다음과 같습니다.
smw:/working/iso_testing # diff a b
4d3
< test.rpm
해당 출력(test.rpm)을 가져와서 세 번째 파일에서 가져오고 싶습니다. 일명 파일 c:
smw:/working/iso_testing # cat c
QConvergeConsoleCLI QConvergeConsoleCLI-1.1.03-49.x86_64.rpm
aaa_base aaa_base-13.2+git20140911.61c1681-1.3.i586.rpm
acpica acpica-20140724-2.1.2.i586.rpm
test test.rpm
내가 원하는 출력은 다음과 같습니다
test test.rpm
어쩌면 시작해야 할 파일이 많지만 막혔을 수도 있습니다. 미리 감사드립니다
파일 A는 리포지토리의 rpm 목록이고, 파일 B는 .csv 파일의 rpm 목록이며, 파일 C는 파일 B의 복사본이지만 rpm만 아닌 패키지 이름을 포함합니다. ***
답변1
TLDR 솔루션은 다음과 같습니다.
for line in "$(diff a b | sed -n 's/^< //p')"; do grep "${line}" c; done
아래는 좀 더 자세한 설명입니다.
가장 먼저 할 일은 명령의 출력을 정리 diff
하고 검색하려는 문자열을 추출하는 것입니다.
귀하의 예에 따르면 첫 번째 파일(예: 파일 "a")에만 표시되는 행을 원하는 것 같습니다.
다음 명령은 첫 번째 파일의 줄을 반환하고 "<" 접두사를 제거합니다.
diff <(diff a b | sed -n 's/^< //p')
이제 각 줄에 대해 정리된 diff 및 grep을 반복할 수 있습니다. 예를 들면 다음과 같습니다.
for line in "$(diff a b | sed -n 's/^< //p')"; do grep "${line}" c; done
이 접근 방식의 장점은 grep
명령문을 어떤 명령으로든 바꿀 수 있으므로 매우 유연하다는 것입니다.
반면에 고정된 문자열만 검색하려는 경우 for 루프를 사용하는 대신 -f
for 플래그를 사용할 수도 있습니다.grep
grep -f <(diff a b | sed -n 's/^< //p') c
diff
또 다른 옵션은 두 번째로 전화하는 것입니다.
diff <(diff a b | sed -n 's/^< //p') c
그런 다음 비슷한 방식으로 이 출력을 처리할 수 있습니다.
diff <(diff a b | sed -n 's/^< //p') c | sed -n 's/^< //p'