【问题标题】:How to replace a particular value of a field (column) in a file with a value from another file in shell scripting?如何用shell脚本中另一个文件的值替换文件中字段(列)的特定值?
【发布时间】:2013-12-06 02:22:23
【问题描述】:

我有两个文件,分别是 A.txt 和 B.txt。 A.txt 包含三列,如下所示

0 0 17
0 1 17
0 2 4
0 3 50
0 4 90 
....
.... 

我必须用保存在 B.txt 中的相应地图值替换第三列值,如下所示

1 1
2 1
3 1
4 1
..
17 5
..
50 8
..
90 11
..

B.txt 中第一列的值和 A.txt 中第三列的值相同,我需要创建一个新文件(比如 C.txt),其前两列与之前的相同的 A.txt 但第三列包含相应的地图值。 C.txt 示例如下所示

0 0 5, 0 1 5, 0 2 1, 0 3 8, 0 4 11, ..., ...

注意

我有 400000 个文件来执行此操作,所以速度很重要。我为此编写了一个程序,但运行速度非常慢。如果不是创建新文件(C.txt)替换可以节省时间,那么该解决方案也是可以接受的。

while read line
do

     origPhoneme=`echo $line| cut -d " " -f3` 
     while read mapLine
     do
        mapPhone=`echo $mapLine | cut -d " " -f1`
        replacementPhone=`echo $mapLine | cut -d " " -f2`
        if [ $mapPhone == $origPhoneme ]
        then
             echo $replacementPhone >> checkFile
             break
        fi
     done < B.txt
done< A.txt

粘贴 -d " " A.txt checkFile > C.txt

通过使用此代码,C.txt 文件包含我不想要的 A.txt 的第三列

【问题讨论】:

  • 能把运行慢的代码贴出来吗?
  • “我有 400000 个文件要做这个操作,所以速度很重要。”如果您有那么多文件,那么速度可能无关:您可能受 I/O 限制。 (我猜这不适用于足够愚蠢的代码,例如重读 B.txt 并对 A 的每一行进行线性扫描的东西。所以@StevenRumbalski 的建议是一个很好的建议。)
  • 我不知道 shell 脚本,但看起来您正在为 A.txt 的每一行迭代 B.txt 的每一行。这种嵌套循环会很慢。我建议按照下面 Tim Pietzcker 的回答,它会从 B.txt 创建一个字典(映射)以进行快速查找。
  • 我给出的例子只是一个示例。文件通常较长。 B.txt 有 245 行,A.txt 大小各不相同。
  • 如果您的文件都按匹配字段排序,那么您可以使用 unix join 命令。如果它们未排序并且可以更改行的顺序,则可以在使用 join 之前使用 unix sort 命令。

标签: python shell


【解决方案1】:

Python(或 shell 脚本)应该足够快 - 您的任务主要受限于 I/O 速度,而不是处理速度。

所以我建议使用这样的 Python 方法:

B.txt读入字典以便快速查找:

with open("B.txt") as file:
    B = dict(line.strip().split() for line in file)

然后处理A.txt,创建C.txt

with open("A.txt") as infile, open("C.txt", "w") as outfile:
    for line in infile:
        start, end = line.strip().rsplit(None, 1)
        outfile.write("{0} {1}\n".format(start, B[end]))

【讨论】:

  • 谢谢蒂姆。它有效:)
猜你喜欢
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2021-09-18
  • 2016-04-14
相关资源
最近更新 更多