나는 사건이있다이와 유사, 그러나 몇 가지 차이점이 있습니다.
콘텐츠 목록 A:
.co
.best.co
.com
.test.server.cloud.us-east.amazonaws.com
.com.co
.abc.com.co
.jp
.def.museum.hiroshima.jp
.net
.xyz.xxx.yyy.net
.exe
.xyz.exe
# and anything else i want to add
콘텐츠 목록 B:
.bar
.co
.com
.server.cloud.us-east.amazonaws.com
.com.co
.jp
.museum.hiroshima.jp
.net
.xxx.yyy.net
# and anything else i want to add
내가 원하는 것은 "listB"에 나타나는 것으로 끝나지 않는 줄을 "listA"에서 제거하고 중복되는 것입니다.
원하는 출력:
.best.co
.test.server.cloud.us-east.amazonaws.com
.abc.com.co
.def.museum.hiroshima.jp
.xyz.xxx.yyy.net
몇 가지 명령을 시도했지만 작동하지 않습니다.
grep -vi -f <(sed 's:^\(.*\)$:\\\1\$:' listB ) listA > out
grep -v -f <(sed 's/$/$/' listB ) listA > out
미리 감사드립니다
답변1
$ grep -x -f <(sed 's/\./\\./g;s/^/.*/' listB) <(grep -v -F -x -f listB listA)
.best.co
.test.server.cloud.us-east.amazonaws.com
.abc.com.co
.def.museum.hiroshima.jp
.xyz.xxx.yyy.net
두 가지 명령으로 해석됩니다.
1.)grep -v -F -x -f listB listA
그것에서 리터럴 중복을 제거 listA
하고 이 출력을 두 번째 출력의 입력으로 사용하십시오 grep
. 그러면 다음 항목이 남습니다 listA
.
.best.co
.test.server.cloud.us-east.amazonaws.com
.abc.com.co
.def.museum.hiroshima.jp
.xyz.xxx.yyy.net
.exe
.xyz.exe
(삭제할 나머지 행: .exe
및 .xyz.exe
)
2.)grep -x -f <(sed 's/\./\\./g;s/^/.*/' listB) <(...)
.
의 점을 이스케이프하고 시작 부분에 listB
추가한 .*
다음 grep
다시 의 줄로 끝나는 줄을 일치시킵니다 listB
. 입력은 첫 번째 의 결과입니다 grep
.
답변2
# save valid extension from listB
vexts=($(sed "s/^.*\.//g" listB))
# loop over listA and filter desired output
while read line; do
if [[ " ${vexts[@]} " == *" ${line##*.} "* ]] ; then
echo "${line}";
fi
done < listA