如果 txt 文件中存在该值,则替换该值
Replace a value if this value is present in a txt file
大家早上好,我有一个 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
我需要的是将 data.ped
文件第一列中的值替换(在 unix 中)与同一行中 ids.txt
第二列中的值将从 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[]=; next} in a{=a[]; 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。
使用join
命令连接两个文件
join ids.txt data.ped > temp
您可以使用 cut
命令删除第一列,例如:
cut -d " " -f 2- temp > output.ped
awk 'NR==FNR{a[]=; next} in a{=a[]} 1' ids.txt data.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
这是一个经典的 awk 任务,根据您的要求进行了各种修改。在这里,只有当我们在 ids.txt
中找到它的值时,我们才替换 data.ped
的第一个字段,否则我们打印该行不变。如果您想删除不匹配的行:
awk 'NR==FNR{a[]=; next} in a{=a[]; print}' ids.txt data.ped
不需要对输入文件进行排序,第二个文件的顺序被保留。
更新:
如果您的输入中有 Ctrl-M
个字符,请先使用
删除它们
cat file | tr -d '^M' > file.tmp && mv file.tmp file
对于您使用的任何 file
。一般来说,我建议 运行 dos2unix
用于可能包含 ^M
或 \r
等字符的任何文本文件,通常来自 dos/windows 编辑。
大家早上好,我有一个 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
我需要的是将 data.ped
文件第一列中的值替换(在 unix 中)与同一行中 ids.txt
第二列中的值将从 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[]=; next} in a{=a[]; 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。
使用join
命令连接两个文件
join ids.txt data.ped > temp
您可以使用 cut
命令删除第一列,例如:
cut -d " " -f 2- temp > output.ped
awk 'NR==FNR{a[]=; next} in a{=a[]} 1' ids.txt data.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
这是一个经典的 awk 任务,根据您的要求进行了各种修改。在这里,只有当我们在 ids.txt
中找到它的值时,我们才替换 data.ped
的第一个字段,否则我们打印该行不变。如果您想删除不匹配的行:
awk 'NR==FNR{a[]=; next} in a{=a[]; print}' ids.txt data.ped
不需要对输入文件进行排序,第二个文件的顺序被保留。
更新:
如果您的输入中有 Ctrl-M
个字符,请先使用
cat file | tr -d '^M' > file.tmp && mv file.tmp file
对于您使用的任何 file
。一般来说,我建议 运行 dos2unix
用于可能包含 ^M
或 \r
等字符的任何文本文件,通常来自 dos/windows 编辑。