处理大量文件(300k+)以收集结果的更有效方法?

处理大量文件(300k+)以收集结果的更有效方法?

我有一个名为fields.txt并包含L=300k+如下行的文件:

field1 field2 field3
field1 field2 field3
field1 field2 field3
... 
field1 field2 field3

在同一个文件夹中,我有N仅包含一个字符串(让我们识别它s(n))和名为 的文件res-0-n-0,其n任意位置位于0和之间L。然而N < L

res_numbers_sorted.tmp我使用命令生成了包含上述数字排序列表的文件n(不确定是否最有效,但它相当快,我需要将其排序用于其他目的)

find -maxdepth 1 -type f -name "res-0-*" | sort -t'-' -k3 -n | awk -F'-' '{print $3}'>| res_numbers_sorted.tmp

该文件res_numbers_sorted.tmp如下所示:

0
1
8
... 
299963

最后,我想要的是一个名为results.txt以下内​​容的文件:

field1 field2 field3 s(0)
field1 field2 field3 s(1)
field1 field2 field3
...
field1 field2 field3 s(299963) 
...
field1 field2 field3

其中又s(n)是第 n 个 中包含的字符串res-0-n-0

cp fields.txt resutls.txt我首先通过以下循环实现了我想要的目标while

while IFS='' read -r line; do 
     #storing the content of the file in a variable
     res=$(<res-0-"$line"-0)     
     # this is needed in order to take into account that sed addresses the first line of a file with the number 1 whereas the file list starts with 0
     real_line=$(( line + 1 ))     
     sed -i "${real_line}s/.$/ ${res}/" field.txt
done < res_numbers_sorted.tmp

然而,这非常慢,我需要执行几次。我怀疑这可能sed不是适合这项工作的工具。

答案1

如果我理解正确的话,你有一个fields.txt包含很多行的文件。你有几个res-0-n-0文件。并且,对于fields.txt您中的每一行,将其复制到文件results.txt的内容(如果存在)中res-0-<line_number>

我认为您可以简单地fields.txt逐行读取文件,并根据需要回显文件results.txt内容中的行。res-0-<line_number>

我会选择这样的东西:

#! /bin/sh

LINE_NUMBER=0
while read line;
do
  if [ -f "res-0-$LINE_NUMBER-0" ]
  then
    echo "$line $(cat res-0-$LINE_NUMBER-0)" >> result.txt
  else
    echo "$line" >> result.txt
  fi
  ((LINE_NUMBER++))
done < fields.txt

答案2

尝试生成 sed 脚本,然后仅在文件上应用一次field.txt

while IFS='' read -r line; do
    res=$(<res-0-"$line"-0)
    real_line=$(( line + 1 ))
    prinft "%s" "${real_line}s/.$/ ${res}/" >> myscript.sed
done < res_numbers_sorted.tmp

然后执行以下操作:

sed -i -f myscript.sed field.txt

这样,您只需对大文件进行一次迭代。让我知道这是否有帮助。

相关内容