如何在unix中将.fam中的列替换为.txt

iqxoj9l9  于 2022-11-23  发布在  Unix
关注(0)|答案(2)|浏览(169)

我正在寻找一些选项在unix(可能是awk或sed),通过它我可以取代最后一列在我的fam文件与最后一列(v8)的.txt文件。
我的.fam文件如下所示

20481 20481 0 0 2 -9
20483 20483 0 0 1 1
20488 20488 0 0 2 1
20492 20492 0 0 1 1

我的.txt文件看起来像这样。

V1       V2     V3      V4      V6     V7_Pheno   V8
    2253792 20481   NA      DNA     1       Yes    2
    2253802 20483   NA      DNA     4       Yes    2
    2253816 20488   NA      DNA     0       No     1
    2253820 20492   NA      DNA     4       Yes    2

我的outcome.fam文件应该如下所示

20481 20481 0 0 2 2
20483 20483 0 0 1 2
20488 20488 0 0 2 1
20492 20492 0 0 1 2
wfauudbj

wfauudbj1#

  • paste合并行
  • awk允许选择列,因此
paste foo.fam bar.txt | awk '{ print $1 " " $2 " " $3 " " $4 " " $13 }'

我应该做你想做的事
如果要取消.txt文件的标题行,可以调用tail跳过第一行:
tail -n +2 bar.txt
因此,您可以将其集成到命令行中(假设您使用bash

paste foo.fam <(tail -n +2 bar.txt) | awk '{ print $1 " " $2 " " $3 " " $4 " " $13 }'
vdzxcuhz

vdzxcuhz2#

awk可以独自完成。

$: awk 'BEGIN{ getline < "f.txt" } 
     { gsub("[^ ]+$",""); l=$0; getline < "f.txt"; print l$7; }' f.fam
20481 20481 0 0 2 2
20483 20483 0 0 1 2
20488 20488 0 0 2 1
20492 20492 0 0 1 2

BEGIN读取.txt上的标头记录。
然后,对于.fam的每一行,去掉最后一个字段并保存到l
以这种方式使用的getline也解析为字段,因此print l$7;打印.fam中的缩短记录,并添加.txt中的最后一个字段。

相关问题