我有 2 个文件,fileA 和 fileB。
文件A包含:
71
32
23
10
...
和 fileB 包含:
ok
no
no
ok
...
如果fileB中的同一行匹配'no',我想要做的是删除fileA中的行。所以生成的 fileA 想要:
71
10
...
任何命令或 bash 脚本或 vim 都可以做到这一点?
这是一个应该可以解决问题的快速单线:
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
您可以使用 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)