linux AWK If/Else条件问题

mfpqipee  于 2023-03-01  发布在  Linux
关注(0)|答案(4)|浏览(141)

我有这样一个数据:

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-endend+$7)是必须的。所以我们不能只是从输入文件交换列。而且这个AWK将在一个bash脚本中。

c0vxltue

c0vxltue1#

试试看:

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子句在您的示例中 * 仅 * 绑定到{end=$6-$5},而不是绑定到两个花括号中的条目。在这种情况下,{print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $7-end "\t" $7}将在 * 所有 * 行上执行。

laawzig2

laawzig22#

awk '{end=$6-$5}
$4>0{ $0=$1 "\t" $2 "\t" $3 "\t" $4 "\t" $7 "\t" end+$7 }
$4<=0{$0=$1 "\t" $2 "\t" $3 "\t" $4 "\t" $7-end "\t" $7 }1'  file
lnvxswe2

lnvxswe23#

或者将其压缩为一行代码,而不重复print语句:

jot -s ' ' 7 -532 098 | mawk '{ print; $4=-$4; print }' |
mawk '($5 =(__ = $6 - $5) * -!(_ = -(_ = +$4)<_) + \
      ($6 = $7) )^(OFS = "\t") + ($--NF += _*__)'
-532    -427    -322    -217    -112     -7    98
-532    -427    -322    -217      -7     98

-532    -427    -322     217    -112     -7    98
-532    -427    -322     217      98    203
9wbgstp7

9wbgstp74#

echo 'foo foo      scaffold_7      1 4845 6422 4845
bar bar      scaffold_7      -1 14689 16310 16310' | \
awk -v OFS='\t' '{
    print( \
        $1, $2, $3, $4, 
        ( \
            $4>0 ? $7 OFS ($6-$5) + $7 : $7 - ($6-$5) OFS $7 \
        ) \
    )
}'

foo     foo     scaffold_7      1       4845    6422
bar     bar     scaffold_7      -1      14689   16310

相关问题