3

我有 2 个文件,fileA 和 fileB。

文件A包含:

71
32
23
10
...

和 fileB 包含:

ok
no
no
ok
...

如果fileB中的同一行匹配'no',我想要做的是删除fileA中的行。所以生成的 fileA 想要:

71
10
...

任何命令或 bash 脚本或 vim 都可以做到这一点?

4

2 回答 2

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
于 2012-09-25T03:53:38.793 回答
2

您可以使用 paste 加入这些行并使用 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)
于 2012-09-25T03:46:16.253 回答