linux - AWK If/Else 条件问题

标签 linux bash unix awk

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

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

最佳答案

尝试:

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/

相关文章:

linux - bash 脚本来替换单词

bash - bash 变量替换 `##` 中的 `${}` 是什么意思?

java - Java 的 Shell 脚本不工作

arrays - 比较数组的 2 个字符串元素

linux - Docker:附加到特定的 bash

linux - 代码/模块,用于评估要在 Linux 上的 awk 或 bash 中使用的 bool 表达式

javascript - OBJECT NAVIGATORUSERMEDIAERROR 出现在 linux 服务器上运行的录音中

c++ - 如何从 bash 更改库包含二进制文件的路径?

python、unix、NameError : name not defined. 无法识别字符串变量

linux - 有没有办法将 "echoing"到标准输出,将什么作为标准输入重定向到程序(Unix)?