我的数据如下所示:
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