我正在实施一个命令
awk '{if($2 == "1")print $1}' file1
其输出,我想管道grep另一个文件,
之类的东西 awk '{if($2 == "1")print $1}' file1 | grep to file2
但是我不知道将grep传递给另一个文件的现有方法,任何帮助都会有所帮助。感谢
我的文件1看起来像这样
ENSG00000127527:I11 0
ENSG00000086015:I6 0
ENSG00000198336:I7 0
ENSG00000127527:I12 0
ENSG00000086015:I7 0
ENSG00000198342:I1 0
ENSG00000127527:I13 0
ENSG00000086015:I8 0
ENSG00000198342:I2 0
我的文件2如下:
chrX 99892102 99893102 ENSG00000000003:I1 -
chrX 99890744 99890965 ENSG00000000003:I2 -
chrX 99890250 99890402 ENSG00000000003:I3 -
chrX 99889027 99890027 ENSG00000000003:I4 -
chrX 99888537 99888732 ENSG00000000003:I5 -
chrX 99887566 99887983 ENSG00000000003:I6 -
chrX 99885864 99886864 ENSG00000000003:I7 -
chrX 99840145 99840227 ENSG00000000005:I1 +
chrX 99847620 99848620 ENSG00000000005:I2 +
chrX 99849145 99849257 ENSG00000000005:I3 +
答案 0 :(得分:3)
dawg's awk
-only answer可能就是您所需要的,但要解决您提出的问题:
您的问题似乎是:如何将命令的输出作为搜索字词列表传递给grep
来电?
您正在询问是否通过管道传递输出,但是,只有在中搜索的输入也未传递给{{1>时才会生效通过stdin(这是任何命令接收管道输入的方式)。
鉴于您的grep
命令使用实际的文件作为其输入(在中搜索) - grep
- 管道是一个选项:
file2
awk '{if($2 == "1")print $1}' file1 | grep -f /dev/stdin file2
' grep
选项接受搜索字词为文件(暗示OR逻辑:与任意匹配的任何输入行搜索字词文件中的行被认为是匹配项,并且使用-f
作为文件名,/dev/stdin
的输出用作文件'的内容。
注意:使用 GNU awk
,您也可以使用grep
代替-
,但BSD / macOS /dev/stdin
不会使用grep
。支持那个。
以下解决方案无论搜索 in 中的输入本身是否通过stdin传递,都可以正常工作:
在bash
,ksh
和zsh
中,提供命令输出的最简单方法就是使用process substitution (<(...)
):
grep -f <(awk '{if($2 == "1")print $1}' file1) file2
也就是说,在手头的情况下,grep
可能必须首先将传递给-f
的整个文件读入内存,以下是符合POSIX标准的等效文件,使用{{3} ($(...)
),同样有效:
grep "$(awk '{if($2 == "1")print $1}' file1)" file2
然而,后一种形式存在超过平台最大命令行长度的(假设的)风险,而前者没有。
答案 1 :(得分:1)
你的问题非常不清楚。
但是,您可以使用awk
将第一个文件中的行与第二个文件中的行进行对比。
假设:
$ cat /tmp/f1.txt
Apple 1
Pear 1
Tomato 2
Potato 2
Cherry 1
$cat /tmp/f2.txt
Apple
Pear
Tomato
Potato
Cherry
您可以对第二个文件执行grep
之类的传递,并使用第一个文件中的行,如下所示:
$ awk 'NR==FNR && $2==1 {arr[$1]} NR>FNR && $1 in arr{ print }' /tmp/f1.txt /tmp/f2.txt
Apple
Pear
Cherry