gpt4 book ai didi

linux - 在 AWK 中使用 if/else 语句

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:22:49 24 4
gpt4 key购买 nike

我有一个 5 列的文件:

PS 6 15 0 1
PS 1 17 0 1
PS 4 18 0 1

我想以这种 7 列格式获取它:

PS.15 PS 6 N 1 0 1
PS.17 PS 1 P 1 0 1
PS.18 PS 4 N 1 0 1

要创建 7 列中的 6 列,只需直接从原始文件中的列中抓取(有时应用小算术)。但是,要创建一列(第 4 列)需要一个 if-else 语句。

具体来说,要创建新的列 1、2、3,我使用:

 cat File | awk '{print $1"."$3"\t"$1"\t"$2}'

为了创建新的第 5、6、7 列,我使用:

 cat testFileB | awk '{print $4+$5"\t"$4/($4+$5)"\t"$5/($4+$5)}'

为了创建新的第 4 列,我使用:

 cat testFileB | awk '{if ($2 == 1 || $2 == 2 || $2 == 3) print "P"; else print "N";}'

这三个语句独立运行良好,并得到我想要的东西(列的正确值均由制表符分隔)。但是,当我尝试同时应用它们时(一次创建所有 7 列),我只能在第 4 列(if/else 语句列)前后使用不需要的新行(而不是制表符):

例如,我尝试同时创建第 1、2、3、4 列:

 cat File | awk '{print $1"."$3"\t"$1"\t"$2; if ($2 == 1 || $2 == 2 || $2 == 3) print "P"; else print "N";}'

导致在第 4 列之前出现不需要的新行:

PS.15 PS 6
N
PS.17 PS 1
P
PS.18 PS 4

同样,我尝试同时创建第 4、5、6、7 列:

 cat File | awk '{if ($2 == 1 || $2 == 2 || $2 == 3) print "P"; else print "N"; print $4+$5"\t"$4/($4+$5)"\t"$5/($4+$5)}'

在第 4 列后产生不需要的新行:

N
1 0 1
P
1 0 1
N
1 0 1

是否有一种解决方案可以让我一次创建所有 7 列,并且它们之间只有制表符(没有新行)?

最佳答案

如果你不想自动换行,你可以使用 printf 而不是 print。我不太确定您是否想要一个分隔 N1 的制表符,但这很容易调整;

cat testfile | awk '{printf "%s.%s\t%s\t%s\t",$1,$3,$1,$2; if ($2 == 1 || $2 == 2 || $2 == 3) printf "P"; else printf "N"; print $4+$5"\t"$4/($4+$5)"\t"$5/($4+$5)}'

PS.15 PS 6 N1 0 1
PS.17 PS 1 P1 0 1
PS.18 PS 4 N1 0 1

关于linux - 在 AWK 中使用 if/else 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18686599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com