事件がありますこれに似てしかし、いくつかの違いがあります。
コンテンツリスト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
2つのコマンドとして解釈されます。
1.)grep -v -F -x -f listB listA
それからリテラルの重複を排除し、listA
この出力を2番目の出力の入力として使用します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