다른 파일에서 정규식으로 끝나는 줄 제거

다른 파일에서 정규식으로 끝나는 줄 제거

나는 사건이있다이와 유사, 그러나 몇 가지 차이점이 있습니다.

콘텐츠 목록 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

관련 정보