【问题标题】:Replace a value if this value is present in a txt file如果该值存在于 txt 文件中,则替换该值
【发布时间】: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。

【问题讨论】:

    标签: unix replace txt


    【解决方案1】:
    awk 'NR==FNR{a[$1]=$2; next} $1 in a{$1=a[$1]} 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[$1]=$2; next} $1 in a{$1=a[$1]; print}' ids.txt data.ped
    

    输入文件无需排序,保留第二个文件的顺序。


    更新:

    如果您的输入中有 Ctrl-M 字符,请先删除它们

    cat file | tr -d '^M' > file.tmp && mv file.tmp file
    

    对于您使用的任何file。一般来说,我建议对任何可能包含^M\r 等字符的文本文件运行dos2unix,这些字符通常来自dos/windows 编辑。

    【讨论】:

      【解决方案2】:

      使用join命令连接两个文件

      join ids.txt data.ped > temp
      

      您可以使用cut 命令删除第一列,如:

      cut -d " " -f 2- temp > output.ped
      

      【讨论】:

        猜你喜欢
        • 2018-06-22
        • 1970-01-01
        • 1970-01-01
        • 2013-08-11
        • 2018-04-19
        • 2014-09-06
        • 2022-11-17
        • 2018-11-09
        • 1970-01-01
        相关资源
        最近更新 更多