【发布时间】: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之前使用 unixsort命令。