AWK If/Else 条件问题

发布于 2024-08-28 16:23:06 字数 715 浏览 2 评论 0原文

我有一个看起来像这样的数据:

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 脚本内。

I have a data that looks like this:

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

What I want to do is to process the above lines
where I just want to print column 1,2,3, 7 and one more column after 7th.
But with condition when printing column 7 onwards.

Below is my awk script:

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} 
    }'  

But why it doesn't achieve the desired result like this?

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

Note that the arithmetic (e.g. $7-end or end+$7) is a must. So we can't just swap column
from input file. Furthermore this AWK will be inside a bash script.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

恍梦境° 2024-09-04 16:23:06

尝试:

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} 将为所有执行行。

Try:

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
    }
}'

I've never used braces within braces and prefer the semi-colon separators for this purpose. I'm pretty certain the else clause is bound only to {end=$6-$5} in your example, not to both the braced entries. In that case, {print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $7-end "\t" $7} will be executed for all lines.

弄潮 2024-09-04 16:23:06
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
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
傾旎 2024-09-04 16:23:06
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
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
绝不放开 2024-09-04 16:23:06

或者将其压缩为一行而不重复 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

or condense it to one-liner without repeating the print statement :

 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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文