我有一个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列,并且它们之间只有标签(没有新行)?
答案 0 :(得分:1)
如果您不想要自动换行,则可以使用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
答案 1 :(得分: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