使用bash从另一个文件中存在的文件中删除值

时间:2018-03-21 11:38:12

标签: linux bash grep

我有一个制表符分隔文件A,每行包含多个值:

A   B   C   D   E
F   G   H   I
J   K   L   M
N   O   P
Q   R   S   T
U   V
X   Y   Z

我想从文件A中删除以下文件B中包含的元素:

A   D
J   M
U   V

生成文件C:

B   C   E
F   G   H   I
K   L
N   O   P
Q   R   S   T
X   Y   Z

有没有办法用bash做到这一点?

2 个答案:

答案 0 :(得分:1)

如果条目不包含sed的任何特殊符号(例如()[]/\.*?+),您可以使用以下命令:

mapfile -t array < <(<B tr '\t' '\n')
(IFS='|'; sed -r "s/(${array[*]})\t?//g;/^$/d" A > C)

此命令将文件B读入数组。从数组中构造sed命令。 sed命令将过滤掉所有条目并删除空行。

在您的示例中,构造的命令...

sed -r 's/(A|D|J|M|U|V)\t?//g;/^$/d' A > C

...生成以下文件C(空格实际上是标签)

B   C   E
F   G   H   I
K   L   
N   O   P
Q   R   S   T
X   Y   Z

答案 1 :(得分:0)

awk 解决方案:

awk 'NR == FNR{ pat = sprintf("%s%s|%s", (pat? pat "|":""), $1, $2); next }
     { 
         gsub("^(" pat ")[[:space:]]*|[[:space:]]*(" pat ")", "");
         if (NF) print 
     }' file_b file_a

输出:

B   C   E
F   G   H   I
K   L
N   O   P
Q   R   S   T
X   Y   Z