如何根据 .txt 文件 unix 中现有列的值添加新列
How to add new column based on values of existing column in .txt file unix
我有一个包含六列的 .txt 文件。我想根据第 V7_Pheno
列的值将第七列 V8
添加到文件中,Yes
应编码为 2
、No
作为 1
和缺失值作为 -9
V1 V2 V3 V4 V6 V7_Pheno
2253792 20482 NA DNA 1 Yes
2253802 20491 NA DNA 4 Yes
2253816 20503 NA DNA 0 No
2253820 20508 NA DNA 4 Yes
2253821 20509 NA DNA 0 No
2253824 20511 NA DNA 0 No
2253826 20513 NA DNA 3 Yes
2253829 20516 NA DNA 6 Yes
我要找的结果.txt文件应该是这样的
V1 V2 V3 V4 V6 V7_Pheno V8
2253792 20482 NA DNA 1 Yes 2
2253802 20491 NA DNA 4 Yes 2
2253816 20503 NA DNA 0 No 1
2253820 20508 NA DNA 4 Yes 2
2253821 20509 NA DNA 0 No 1
2253824 20511 NA DNA 0 No 1
2253826 20513 NA DNA 3 Yes 2
2253829 20516 NA DNA 6 Yes 2
使用awk
:
awk 'NR==1{="V8";print;next}\
== "Yes" {="2"};\
== "No" {="1"}1' a.txt |column -t
- 第一行在header
中打印V8
- 如果第 6 列的值:
V7_Pheno
为 Yes
,则 = "2"
- 如果第 6 列的值:
V7_Pheno
是 No
,则 = "1"
column -t
: 为了更好的格式化
使用 Perl:
perl -lane 'print join "\t", @F, $.==1 ? "V8" : $F[5]=~/No/ ? 1 : $F[5]=~/Yes/ ? 2 : -9' file.txt | column -t
print join "\t", @F
打印每一行的字段,使用制表符作为字段分隔符。
$.==1 ? "V8"
如果这是第一行,打印一个附加字段 V8
.
$F[5]=~/No/ ? 1
否则,如果第 6 个字段是 No
,则打印一个附加字段 1
.
$F[5]=~/Yes/ ? 2
否则,如果第 6 个字段是 Yes
,则打印一个附加字段 2
.
-9
否则,打印 -9
.
我有一个包含六列的 .txt 文件。我想根据第 V7_Pheno
列的值将第七列 V8
添加到文件中,Yes
应编码为 2
、No
作为 1
和缺失值作为 -9
V1 V2 V3 V4 V6 V7_Pheno
2253792 20482 NA DNA 1 Yes
2253802 20491 NA DNA 4 Yes
2253816 20503 NA DNA 0 No
2253820 20508 NA DNA 4 Yes
2253821 20509 NA DNA 0 No
2253824 20511 NA DNA 0 No
2253826 20513 NA DNA 3 Yes
2253829 20516 NA DNA 6 Yes
我要找的结果.txt文件应该是这样的
V1 V2 V3 V4 V6 V7_Pheno V8
2253792 20482 NA DNA 1 Yes 2
2253802 20491 NA DNA 4 Yes 2
2253816 20503 NA DNA 0 No 1
2253820 20508 NA DNA 4 Yes 2
2253821 20509 NA DNA 0 No 1
2253824 20511 NA DNA 0 No 1
2253826 20513 NA DNA 3 Yes 2
2253829 20516 NA DNA 6 Yes 2
使用awk
:
awk 'NR==1{="V8";print;next}\
== "Yes" {="2"};\
== "No" {="1"}1' a.txt |column -t
- 第一行在header 中打印
- 如果第 6 列的值:
V7_Pheno
为Yes
,则= "2"
- 如果第 6 列的值:
V7_Pheno
是No
,则= "1"
column -t
: 为了更好的格式化
V8
使用 Perl:
perl -lane 'print join "\t", @F, $.==1 ? "V8" : $F[5]=~/No/ ? 1 : $F[5]=~/Yes/ ? 2 : -9' file.txt | column -t
print join "\t", @F
打印每一行的字段,使用制表符作为字段分隔符。
$.==1 ? "V8"
如果这是第一行,打印一个附加字段 V8
.
$F[5]=~/No/ ? 1
否则,如果第 6 个字段是 No
,则打印一个附加字段 1
.
$F[5]=~/Yes/ ? 2
否则,如果第 6 个字段是 Yes
,则打印一个附加字段 2
.
-9
否则,打印 -9
.