我有一个看起来像这样的数据:
foo foo scaffold_7 1 4845 6422 4845
bar bar scaffold_7 -1 14689 16310 16310
我想做的是处理上面几行 我只想打印第 1、2、3、7 列和第 7 列之后的一列。 但是从第 7 列开始打印时有条件。
下面是我的 awk 脚本:
awk '{
if ($4=="+") { {end=$6-$5}{print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $7 "\t" end+$7} }
else
{end=$6-$5}{print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $7-end "\t" $7}
}'
但是这样为什么达不到预期的效果呢?
foo foo scaffold_7 1 4845 6422
bar bar scaffold_7 -1 14689 16310
请注意,算术运算(例如 $7-end
或 end+$7
)是必须的。所以我们不能只是交换列
从输入文件。此外,此 AWK 将位于 bash 脚本中。
最佳答案
尝试:
awk 'BEGIN {OFS = "\t"} {
end = $6 - $5
if ($4 >= 0) {
print $1, $2, $3, $4, $7, end + $7
} else {
print $1, $2, $3, $4, $7 - end, $7
}
}'
我从来没有在大括号内使用大括号,为此更喜欢使用分号分隔符。我很确定在您的示例中,else 子句仅绑定(bind)到{end=$6-$5}
,而不是两个大括号条目。在这种情况下,{print $1 "\t"$2 "\t"$3 "\t"$4 "\t"$7-end "\t"$7}
将被执行 所有 行。
关于linux - AWK If/Else 条件问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2619959/