awk 会自动复制一些行。有人可以解释一下吗?

awk 会自动复制一些行。有人可以解释一下吗?

我的数据如下所示:

A 4 G 1 G 1
C 4 C 2 C 2
T 6 T 5 T 5
A 6 T 2 T 2
C 6 T 2 T 2
T 6 G 2 G 2

我正在尝试命令:

awk -F " " '$1==$3 {$7=$6; print $0;}
            $1==$5 {$7=$4; print $0;}
            ($1 != $3 && $1 != $5) {$7=$2; print $0}' test.txt

虽然数据只有 5 行,但输出有 7 行,并且某些行是随机重复的。

不知何故,只有这个数据集会发生这种情况,而我拥有的其他数据集不会发生这种情况。有人可以帮忙吗?我不明白发生了什么事

答案1

您没有准确描述您希望其如何表现 - 所以我在这里进行一些猜测。

查看重复的行,例如

C 4 C 2 C 2

$1 与 $3 相同,因此第一个块被触发。 $1 与 $5 相同,因此第二个块被触发。

如果你只想每行输入一行输出,那么只在一个地方输出数据,例如

awk -F " " '$1==$3 {$7=$6;}
            ($1==$5) {$7=$4; }
            ($1 != $3 && $1 != $5) {$7=$2}
            ($7 != "") { print $0 }' test.txt

我认为这是您正在寻找的行为,但是它将产生与输入相同或更少的输出行。如果您希望每个输入行有一行输出,请删除最后一个块上的条件。

答案2

awk -F " " '$1==$3 {$7=$6; print $0;}
            $1==$5 {$7=$4; print $0;}
            ($1 != $3 && $1 != $5) {$7=$2; print $0}' test.txt

例如,如果 和$1==$3$1==$5为真,则前两个块都会运行并打印。第 2 行和第 3 行就是这种情况。这两个块也都从两个不同的字段设置 $7,尽管这里发生的两行上的值是相同的。

如果您只想打印每一行最多一次,您可以从分支设置一个标志并基于该标志进行打印(或不打印),例如:

awk -F " " '{ p=0; } 
            $1==$3 {$7=$6; p=1}
            $1==$5 {$7=$4; p=1}
            ($1 != $3 && $1 != $5) {$7=$2; p=1}
            p {print}' test.txt

print$0如果没有给出其他参数,则打印,并且您实际上可以p在最后不使用代码块,因为默认操作就是这样。

类似地,要无条件打印每一行,您通常只会看到一个尾随1,如awk '/.../ { ... } 1'

不过,您必须决定如何处理字段$7,因为这三个分支都将它们设置为不同的值。

如果您只想执行其中一个块(最多),您可以使用next每个块中的语句转到下一行:

awk -F " " '$1==$3 {$7=$6; print; next}
            $1==$5 {$7=$4; print; next}
            ($1 != $3 && $1 != $5) {$7=$2; print; next}
           ' test.txt

...实际上看看条件,在我看来,只有当且仅当前两个条件为假时,最后一个条件才为真,所以我们不妨将其全部写为 if-else:

awk -F " " '{ if ($1==$3)      { $7=$6 };
              else if ($1==$5) { $7=$4 };
              else             { $7=$2 };
              print;
            }' test.txt

相关内容