我有一个像这个小例子的文本文件:
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
但它不起作用并且什么都不返回。你知道我怎么纠正代码吗?
答案 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=" "
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)
)中筛选该行