如果另一个文件中的同一行与模式匹配,则删除行

时间:2012-09-25 03:36:55

标签: bash vim scripting

我有2个文件,fileA和fileB。

fileA包含:

71
32
23
10
...

和fileB包含:

ok
no
no
ok
...

如果fileB中的同一行匹配'no',我想要删除fileA中的行。 因此得到的文件A希望:

71
10
...

任何命令或bash脚本或vim都可以这样做?

2 个答案:

答案 0 :(得分:2)

您可以使用粘贴来连接线条和while循环来迭代它们:

while read -r a_input b_input; do
   [[ $b_input == "ok" ]] && echo "$a_input"
done < <(paste -d' ' fileA fileB)

使用awk来完成:

awk '$2 == "ok" { print $1 }' < <(paste -d' ' fileA fileB)

答案 1 :(得分:2)

这是一个快速的单行应该做的伎俩:

sed "$(awk '/no/{print NR"d"}' fileB)" fileA

您将正则表达式与上面的“否”一词相匹配。

它的工作原理是用awk扫描第一个,然后打印行号,然后打印匹配所在位置的字母“d”。 nd的这种模式是一个sed命令,它删除输入流的第n行。

此版本不会修改fileA的内容,但会将删除行的结果打印到stdout。使用sed的-i标志来修改文件:

sed -i "$(awk '/no/{print NR"d"}' fileB)" fileA