使用awk处理2个文本文件

时间:2018-02-08 16:06:39

标签: awk

我有一个像这个小例子的文本文件:

chr12   2904300 2904315 peak_8        167     .       8.41241 21.74573        16.71985        65
chr1    3663184 3663341 peak_9        77      .       7.86961 12.16321        7.70843 37
chr1    6284759 6285189 peak_10       220     .       13.85268        27.34231        22.06610        332
chr1    6653468 6653645 peak_11       196     .       13.59296        24.85586        19.68392        117
chr1    8934964 8935095 peak_12       130     .       8.82937 17.84867        13.03453        36

并有另一个文件,如第二个例子:

ENSG00000004478|12|2904119|2904309
ENSG00000002933|7|150498624|150498638
ENSG00000173153|11|64073050|64073208
ENSG00000001626|7|117120017|117120148
ENSG00000003249|16|90085750|90085881
ENSG00000003056|12|9102084|9102551

第一个例子是tab分开,第二个例子是| 我想只选择第一个例子中的行 第一个例子中第2列和第3列的平均值在第3和第3列之间 第二个示例中的第4列以及第一列的编号 在第一个例子中,它等于第二个例子的第二列“。 例如,这两个例子的输出将是:

chr12   2904300 2904315 peak_8        167     .       8.41241 21.74573        16.71985        65

我正在尝试使用awk:

awk 'FNR==NR{a[FNR]=($2+$3)/2;b[FNR]=$0;next} (FNR in a) && ($3<=a[FNR] && $4>=a[FNR]){print b[FNR]}'  file1  FS="|"  file2

但它不起作用并且什么都不返回。你知道我怎么纠正代码吗?

1 个答案:

答案 0 :(得分:0)

溶液

#include "stdafx.h"
#include "Region.h"


Region::Region()
{
}

Region::Region(string name)
{
    regionName = name;
    owner = "none";
    numTokens = 0;
}

Region::~Region()
{
}

void Region::setOwner(string playerName)
{
    playerName = owner;
}

string Region::getRegionName() const
{
    return regionName;
}

int Region::getNumTokens() const
{
    return numTokens;
}

void Region::setRegionName(string name)
{
    regionName = name;
}

void Region::setNumTokens(int num)
{
    numTokens = num;
}

void Region::addNeighbor(Region r)
{
    neighbors.push_back(r);
}

vector<Region> Region::getNeighbors() const
{
    return neighbors;
}

string Region::getOwner() const
{
    return owner;
}
默认情况下

file1 awk 'NR==FNR ? \!((a[NR]=$1)&&(z[NR]=$0)&&(avr[NR]=($3+$2)/2)) : (($4>=avr[FNR] && avr[FNR]>=$3)&&(a[FNR]=="chr"$2)){print z[FNR] }' file1 FS="|" file2 ,file2 FS=" "

awk FS="|"部分描述

1)。 ?:检查我们正在解析的文件是第一个还是第二个

NR==FNR - 到目前为止看到的输入记录总数。

NR - 当前输入文件中的输入记录编号

2)如果处理第一个文件FNR

\!((a[NR]=$1)&&(z[NR]=$0)&&(avr[NR]=($3+$2)/2)) - 阻止打印到屏幕

\! - 数组包含文件的第一个字段

a[NR]=$1 - 数组包含第一个文件的行

z[NR]=$0 - 数组保存第一个文件的平均请求数

3)检查第二个文件打印行的条件:

a) avr[NR]=($3+$2)/2

b) (($4>=avr[FNR] && avr[FNR]>=$3)&&(a[FNR]=="chr"$2)){print z[FNR] } - 检查第一个文件的平均值是否在字段3&amp;的值之间。第二个文件中的4个

c) ($4>=avr[FNR] && avr[FNR]>=$3) - 检查字段1(第一个文件)中的数字&amp;字段2(第二个文件)是相同的

** d)**如果条件为真,则打印以从第一个文件((a[FNR]=="chr"$2))中筛选该行