Python 或 Unix/bash。重命名目录中每个文件的第 11 列

Posted

技术标签:

【中文标题】Python 或 Unix/bash。重命名目录中每个文件的第 11 列【英文标题】:Python or Unix/bash. Rename 11th column of each file within a directory 【发布时间】:2021-05-21 18:35:25 【问题描述】:

我有一个包含数千个 .txt 文件的目录。在每个文件中,第 11 列具有不同的名称。这是一个 .txt 文件前几行的示例:

ID  maxage  gender  GA_NAT  GA_EUR  pv  Y   M   C   A   rs148292867
1   16  0   0.4443  0.5298  7.378472    0.01692 0.451366    0.526591     0.005124   0
2   17.1362080766598    0   0.3377  0.6463  7.639588    0.007403    0.333114    0.659472    0.00001 0
4   15.937029431896 1   0.4398  0.5227  9.082893    0.016812    0.410415    0.538821    0.033953    0 

使用 Python 或 Unix/Bash,我想将每个文件的第十一列重命名为“GT”。我正在尝试类似:

import glob

files = glob.glob("/mypath/*.txt")

for i in range(len(files)):
    from_file = open(files[i]) 
    # add to each file columns.values[11] = "GT"

    to_file = open(files[i], mode="w")
    to_file.write("")
    shutil.copyfileobj(from_file, to_file)

我确信有一种简单的方法可以做到这一点,但我做不到。

【问题讨论】:

使用起来可能更简单awk. 嗨@S3DEV,我只是编辑帖子以包含 unix/bash 一个“字段”可能有很多含义,具体取决于文件的格式。是:csv、tsv、固定宽度还是其他?如果您包含其中一个文件的前几行,可能会有所帮助。 嗨@r2evans,我刚刚添加了一个文件的第一行。他们是tsv。谢谢 假设要替换的字段始终是行中的最后一个字段是否安全? 【参考方案1】:

如果可以安全地假设第 11 位始终是该行的最后一个字段,那么我建议 sed 可以很好地做到这一点(awk 也可以)。

将您的示例行复制到两个文件quux1.txtquux2.txt,我可以这样做

$ cat quux[12].txt
ID  maxage  gender  GA_NAT  GA_EUR  pv  Y   M   C   A   rs148292867
1   16  0   0.4443  0.5298  7.378472    0.01692 0.451366    0.526591     0.005124   0
2   17.1362080766598    0   0.3377  0.6463  7.639588    0.007403    0.333114    0.659472    0.00001 0
4   15.937029431896 1   0.4398  0.5227  9.082893    0.016812    0.410415    0.538821    0.033953    0
ID  maxage  gender  GA_NAT  GA_EUR  pv  Y   M   C   A   rs148292867
1   16  0   0.4443  0.5298  7.378472    0.01692 0.451366    0.526591     0.005124   0
2   17.1362080766598    0   0.3377  0.6463  7.639588    0.007403    0.333114    0.659472    0.00001 0
4   15.937029431896 1   0.4398  0.5227  9.082893    0.016812    0.410415    0.538821    0.033953    0

$ sed -i -E '1 s/\S+\s*$/GT/g' quux[12].txt

$ cat quux[12].txt
ID  maxage  gender  GA_NAT  GA_EUR  pv  Y   M   C   A   GT
1   16  0   0.4443  0.5298  7.378472    0.01692 0.451366    0.526591     0.005124   0
2   17.1362080766598    0   0.3377  0.6463  7.639588    0.007403    0.333114    0.659472    0.00001 0
4   15.937029431896 1   0.4398  0.5227  9.082893    0.016812    0.410415    0.538821    0.033953    0
ID  maxage  gender  GA_NAT  GA_EUR  pv  Y   M   C   A   GT
1   16  0   0.4443  0.5298  7.378472    0.01692 0.451366    0.526591     0.005124   0
2   17.1362080766598    0   0.3377  0.6463  7.639588    0.007403    0.333114    0.659472    0.00001 0
4   15.937029431896 1   0.4398  0.5227  9.082893    0.016812    0.410415    0.538821    0.033953    0

(注意-i是就地编辑,此操作后此数据会丢失。如果您需要保存备份,您可以-i.bak -E或手动复制它们。)

【讨论】:

谢谢@r2evans。该脚本会为目录中的所有文件(~1,000,000)执行此操作吗? 取决于您使用的文件 grob(quux[12].txt 此处),是的。请注意您使用的文件名通配符。

以上是关于Python 或 Unix/bash。重命名目录中每个文件的第 11 列的主要内容,如果未能解决你的问题,请参考以下文章

macos 中目录重命名的意外行为(其他 posix 风格?)

DOS按规则批量重命名所有(子)目录下文件

使用 Python 重命名目录中的多个文件

python重命名子目录中的所有文件

在Python中重命名目录中的多个文件[重复]

DOS按规则批量重命名所有(子)目录下文件