如何根据 .txt 文件 unix 中现有列的值添加新列

How to add new column based on values of existing column in .txt file unix

我有一个包含六列的 .txt 文件。我想根据第 V7_Pheno 列的值将第七列 V8 添加到文件中,Yes 应编码为 2No作为 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
  1. 第一行在header
  2. 中打印V8
  3. 如果第 6 列的值:V7_PhenoYes,则 = "2"
  4. 如果第 6 列的值:V7_PhenoNo,则 = "1"
  5. 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.