我的标准输入上有一行
$printf "C\nB\nA\n"
C
B
A
我希望过滤掉其他标准输入上出现的行(或子字符串或正则表达式 - 更容易):
$printf "B\nA\n"
B
A
我希望在条目过滤后只有C
。
我试过
$printf "C\nB\nA\n" | grep -v `printf "B\nA\n"`
但后来我得到了
grep: A: No such file or directory
如何通过其他命令返回的行执行标准输入的过滤?
答案 0 :(得分:6)
您可以使用grep
的{{1}}选项:
-f
并使用Matching Control
-f FILE, --file=FILE
Obtain patterns from FILE, one per line.
[...]
语法将命令的输出用作要使用的内容:
<(command)
答案 1 :(得分:2)
使用awk来控制每条线应该如何相互匹配:
$ printf "C\nB\nA\n" | awk 'NF == FNR { a[$0] = 1; next } a[$0]' \
<(printf "A\nB\n") -
通过更改a[$0]
,您可以定义每个应匹配的方式,即打印行
来自file1.txt,第一列是file2.txt:
$ awk 'NF == FNR { a[$0] = 1; next } a[$1]' file2.txt file1.txt
# ^ Print if column 1 from file1.txt
# is in file2.txt
从file2.txt中打印第一列中包含的行。{/ p>
$ awk 'NF == FNR { a[$1] = 1; next } a[$0]' file2.txt file1.txt
# ^ Print if line from file1.txt match
# ^ Store column one from file2.txt
答案 2 :(得分:0)
你可以使用
printf "C\nB\nA\n" | grep -v C
随后
printf "C\nB\nA\n" | grep -v C | grep -v B
然后
printf "C\nB\nA\n" | grep -v A | grep -v B
如果你想从文件中做到这一点 假设文件包含
C
B
A
然后:
cat file | grep -v B | grep -v A
将打印
C
如果你想只用一次管道过滤
cat file | grep -v 'B\|A'
C