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.txt
和quux2.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 列的主要内容,如果未能解决你的问题,请参考以下文章