【发布时间】:2021-01-14 22:14:14
【问题描述】:
大家早上好,我有一个由数千列和数百行组成的data.ped 文件。文件的前 6 列和前 4 行如下所示:
186 A_Han-4.DG 0 0 1 1
187 A_Mbuti-5.DG 0 0 1 1
188 A_Karitiana-4.DG 0 0 1 1
191 A_French-4.DG 0 0 1 1
我有一个ids.txt 文件,看起来像这样:
186 Ignore_Han(discovery).DG
187 Ignore_Mbuti(discovery).DG
188 Ignore_Karitiana(discovery).DG
189 Ignore_Yoruba(discovery).DG
190 Ignore_Sardinian(discovery).DG
191 Ignore_French(discovery).DG
192 Dinka.DG
193 Dai.DG
我需要的是用 ids.txt 的第二列中的值替换(在 unix 中)data.ped 文件的第一列中的值,该值与要执行的值在同一行中从data.ped 文件中替换。例如,我想将data.ped 第一列中的“186”值替换为ids.txt 第二列中的“Ignore_Han(discovery).DG”值(这是因为在同一行的第一列中这个值是“186”)所以output.ped文件必须是这样的:
Ignore_Han(discovery).DG A_Han-4.DG 0 0 1 1
Ignore_Mbuti(discovery).DG A_Mbuti-5.DG 0 0 1 1
Ignore_Karitiana(discovery).DG A_Karitiana-4.DG 0 0 1 1
Ignore_French(discovery).DG A_French-4.DG 0 0 1 1
data.ped 文件第一列的值是 ids.txt 文件第一列中存在的值的子集。所以总会有匹配的。
编辑:
我试过这个:
awk 'NR==FNR{a[$1]=$2; next} $1 in a{$1=a[$1]; print}' ids.txt data.ped
但是当我检查结果时:
cut -f 1-6 -d " " output.ped
我得到这个奇怪的输出:
A_Han-4.DG 0 0 1 1y).DG
A_Mbuti-5.DG 0 0 1 1y).DG
A_Karitiana-4.DG 0 0 1 1y).DG
A_French-4.DG 0 0 1 1y).DG
如果我使用这个命令:
cut -f 1-6 -d " " output.ped | less
我明白了:
Ignore_Han(discovery).DG^M A_Han-4.DG 0 0 1 1
Ignore_Mbuti(discovery).DG^M A_Mbuti-5.DG 0 0 1 1
Ignore_Karitiana(discovery).DG^M A_Karitiana-4.DG 0 0 1 1
Ignore_French(discovery).DG^M A_French-4.DG 0 0 1 1
我不明白为什么每一行都有^M。
【问题讨论】: