通过一个文件的管道输出在另一个文件上grep

时间:2017-01-30 00:31:26

标签: file awk grep pipe

我正在实施一个命令

 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  +

2 个答案:

答案 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传递,都可以正常工作:

bashkshzsh中,提供命令输出的最简单方法就是使用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