1
输入数据是基于如下柱2排序:打印是在指定值范围内基于特定的列作为AWK对所有行
1 100
1 101
1 200
3 360
4 800
4 950
4 952
随着例如数据所需的输出是:
1 200 3 360
4 800 4 950
4 800 4 952
也就是说,如果有第2列中的值在范围内的行:value2大于value1 + 100 & & value2小于value1 + 200。
我的尝试是:
awk 'BEGIN{FS="\t"; PREVLOC=$2; PREVLINE=$0}{ if($2>PREVLOC+200 || $2<PREVLOC+100 {PREVLOC=$2; PREVLINE=$0;} else {print PREVLINE"\t"$0; PREVLOC=$2; PREVLINE=$0;} }' inputfile
节省了前行和前行2列到了比较变量。但是,它并不适用于所有情况。用示例数据,它不会打印最后一对。如果它们之间存在一行,其第二列值例如是0,则它将不输出800-950对。 890.
目前,我已经解决了这个问题,在完全不同的方式在bash有:
`while read var1 var2; do stuff with vars in awk; done<inputfile`
但它是非常缓慢的。任何帮助深表感谢。
嗨,非常感谢。这正是我所期待的。我的文件每行大约有100行,并且可以有多达1000行(当然并行处理它们)。实际数据在更多领域更复杂。除了while循环外,唯一的解决方法是创建所有可能的连接对,然后通过awk,例如, ('awk'{print 1'\ t“$ 0}'inputfile)<(awk'{print 1'\ t”$ 0}'inputfile)的示例数据'join -1 1 -2 1 -t $' | awk'BEGIN {OFS = FS =“\ t”} {if($ 5> $ 3 + 100 && $ 5 <$ 3 + 200)print $ 2,$ 3,$ 4,$ 5}' – 5heikki
太棒了! http://backreference.org/2010/02/10/idiomatic-awk/中的“双文件处理”部分对这种使用awk来处理这些自连接问题的方式给出了更多的解释(当然这两个文件是相同的文件)。 – jas