我正在尝试输出制表符分隔的结果,该结果使用制表符分隔文件中的数据来组合和减去特定行。
如果testtorun_ig1_1
在每一行中匹配,则第一个匹配的顺序$4
值会添加到$6
,除非值为$2
,然后是原始1
使用(就像第1行的情况一样)。这是新的或调整后的$2
值。
最后匹配的顺序$2
值已添加到$6
,这是新的或已调整的$2
值。
新$3
和$2
个字母与$3
$1
格式$1
:$2
- $3
和{{1}合并值打印在该行上。
只要$5
值是唯一的,awk
命令就可以很好地工作,但情况并非总是如此。我似乎无法添加条件
检查$4
,如果数字不是连续的(1 2是,但是在92 93 94之间有一个中断),当有一个中断新线时。
也许有另一种方式,但希望这会有所帮助。谢谢:))
文件
$6
所需的输出
chrX 110956442 110956535 chrX:110956442-110956535 ALG13 1 19
chrX 110956442 110956535 chrX:110956442-110956535 ALG13 2 19
chrX 110956442 110956535 chrX:110956442-110956535 ALG13 92 18
chrX 110956442 110956535 chrX:110956442-110956535 ALG13 93 18
chrX 110956442 110956535 chrX:110956442-110956535 ALG13 94 18
chrX 110961329 110961512 chrX:110961329-110961512 ALG13 2 1
chrX 110961329 110961512 chrX:110961329-110961512 ALG13 3 1
chrX 25031028 25031925 chrX:25031028-25031925 ARX 651 3
AWK
chrX:110956442-110956444 ALG13
chrX:110956534-110956536 ALG13
chrX:110961331-110961332 ALG13
chrx:25031679-25031679 ARX
当前输出
awk 'FNR==NR {S[$4]++;next} ($4 in S){if(S[$4]>1){print $1 OFS $2 OFS $2+S[$4] OFS $5;}
else {if($6==1){print $1 OFS $2 OFS $2 OFS $5}
else {print $1 OFS $2+$6 OFS $2+$6 OFS $5}};delete S[$4]}' file file
答案 0 :(得分:1)
这可以满足您的大部分需求:
function myprint(start, first, last, key) {
print "chrX:" (start + first) "-" (start + last) "\t" key;
}
NR == 1 {
last_start = $2;
key = $5;
first_stop = $6;
last_stop = $6;
next;
}
{
if ($2 == last_start) {
if ($6 != (last_stop + 1)) {
myprint(last_start, first_stop, last_stop, key);
first_stop = $6;
}
} else {
myprint(last_start, first_stop, last_stop, key);
last_start = $2;
first_stop = ($6 == 1) ? 0 : $6;
}
key = $5;
last_stop = $6;
}
END {
myprint(last_start, first_stop, last_stop, key);
}
但是,我花了很长时间才了解您的要求,而且我仍然不明白为什么您期望的输出的第二行是chrX:110956534-110956628 ALG13
,因为94 - 92 == 2
。