我有一个名为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
这样,您只需对大文件进行一次迭代。让我知道这是否有帮助。