我有一个制表符分隔文件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做到这一点?
答案 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