簡體   English   中英

在AWK中間使用if / else語句

[英]Using an if/else statement in the middle of AWK

我有一個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

只需設置您的OFS(而不是在整個行中重復\\t ),然后使用三元運算符即可打印P或N:

$ awk -v OFS='\t' '{s=$4+$5;print $1"."$3,$1,$2,($2~/^[123]$/?"P":"N"),s,$4/s,$5/s}' file
PS.15   PS      6       N       1       0       1
PS.17   PS      1       P       1       0       1
PS.18   PS      4       N       1       0       1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM