我有一个类似的案例,但它有一些不同。
内容列表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
我想要的是从“listA”中删除那些不以“listB”中出现的内容结尾的行,并且也重复
期望的输出:
.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 -v -F -x -f listB listA
从中删除重复的文字
listA
并将此输出用作 second 的输入grep
。这留下了以下条目listA
:(要删除的剩余行:
.exe
和.xyz.exe
)2.)
grep -x -f <(sed 's/\./\\./g;s/^/.*/' listB) <(...)
转义 in 中的点
.
,listB
添加.*
到开头并grep
再次匹配以 in 结尾的那些行listB
。输入是第一个的结果grep
。