这就是我想要的。 在文件 1 中提取两个字符串之间的任意数字并将其保存为 var。 然后在文件 2 中搜索此 var,并将提取的数字和字符串之间的整行附加到另一个文件中。 这必须逐行完成,直到文件 1 结束。
我开始的时候是这样的
while IFS= read -r row || [[ -n "$row" ]]; do
NUMBER="$(sed -n '/startstring/,/endstring/p' $row)"
LINE="$(sed -n "/$NUMBER/,/string/p" file2)"
echo "$LINE" >> filenew
done < "file1"
或者这个
while IFS= read -r row || [[ -n "$row" ]]; do
NUMBER="$(grep -oP "(?<=startstring)[0-9]*(?=endstring)" $row)"
LINE="$(grep -oP "(?<=$NUMBER)(?=string)" file2)"
echo "$LINE" >> filenew
done < "file1"
这是我的技能允许我做的事情,但我现在陷入困境了:D
编辑: 我的解决方案有效
input_file="file1"
search_file="file2"
output_file="file3"
while read -r line; do
NUMBER=$(echo "$line" | grep -oP 'string1.*string2' | grep -o '[0-9]*')
SEARCH=$(grep -oP "$NUMBER.*STRING" $search_file)
if [ -n "$SEARCH" ]; then
echo "$SEARCH" >> "$output_file"
fi
done < "$input_file"
当输入文件=~25mb 和搜索文件=~10mb 时,此任务的持续时间约为 3.5 小时。 这对我来说没问题,但也许有一个使用基本 bash 工具的更智能、更快的解决方案?
EDIT2:附加一些示例。
第一个文件内容如下
tt5090568 movie Transformers: Rise of the Beasts 0 2023 \N
tt5090580 movie London Boy London Boy 0 \N \N \N Crime
tt5090636 movie Alistair1918 Alistair1918 0 2015 \N 86
tt5090642 movie Dennis the Menace Dennis the Menace 0 \N \N
tt5090710 movie Craving Cuba Craving Cuba 0 2016 \N 60
tt5090756 movie New You New You 0 \N \N \N Horror
tt5090838 movie Crash Site Crash Site 0 2015 \N 86 \N
第二个文件内容如下(我以这部电影为例)
tt5090568 32 Transformers: Rise of the Beasts IE en imdbDisplay
tt5090568 33 Transformers. El despertar de las bestias VE \N
tt5090568 34 Transformers: Rise of the Beasts CA en imdbDisplay
tt5090568 35 Transformers: Uspon zvijeri HR \N imdbDisplay \N 0
tt5090568 36 Transformers: O Despertar das Feras PT \N imdbDisplay
tt5090568 37 Transformers: Quái Thú Trỗi Dậy VN \N imdbDisplay \N
tt5090568 38 Transformers: Monštrá sa prebúdzajú SK \N imdbDisplay
tt5090568 39 Transformers: El Despertar De Las Bestias CO \N
tt5090568 3 Transformers: El despertar de las bestias EC \N
tt5090568 40 Transformers: El despertar de las bestias AR \N
tt5090568 41 Трансформеры: Восхождение Звероботов RU \N
tt5090568 42 Transformers: A fenevadak kora HU \N imdbDisplay \N
tt5090568 43 Transformers: Rise of the Beasts SE \N imdbDisplay
tt5090568 44 Трансформърс: Възходът на зверовете BG bg imdbDisplay
tt5090568 45 Transformers: Rise of the Beasts PH en imdbDisplay
tt5090568 46 變形金剛:萬獸崛起 TW \N imdbDisplay \N 0
tt5090568 47 Transformers: El Despertar De Las Bestias PR \N \N
tt5090568 48 Transformers: Rise of the Beasts IN en imdbDisplay
tt5090568 49 Transformersi: Buđenje zveri RS \N imdbDisplay \N
tt5090568 4 Transformers: Aufstieg der Bestien DE \N imdbDisplay
tt5090568 50 Transformers: El Despertar De Las Bestias CL \N
tt5090568 51 Transformers: El Despertar De Las Bestias MX \N
为了以后的目的,我需要发布年份。为了确保这部电影是准确的。我不知道具有完全相同名称和相同发行年份的电影,所以我认为这应该足够安全。目前我只需要处理提供了发布年份信息的条目。
该脚本应提取每行的每个数字行,直到文件 1 末尾,并在文件 2 中搜索该数字。如果在文件 2 中找到,则将包含 ger 标题(DE 标志)的整行复制到新文件,包括文件中的原始行1.
在执行任务之前,我使用 sed 整理输入文件以进行某些格式设置。我发现编写脚本代码更容易。 我将它们精简为我需要的信息,然后看起来像
file 1 example
tt5090568#Transformers: Rise of the Beasts#2023
file 2 example
tt5090568#Transformers: Aufstieg der Bestien#DE
File 3 should look like
tt5090568#Transformers: Rise of the Beasts#2023
tt5090568#Transformers: Aufstieg der Bestien#DE
现在我将发布年份读入 var 并让 sed 将 #DE 更改为 2023(在本例中)。
目标: 最后,我有带有发行年份的原始标题,如果有的话,蒙古包标题也带有发行年份。
File 3 finaly should look like
tt5090568Transformers: Rise of the Beasts2023
tt5090568Transformers: Aufstieg der Bestien2023
有什么想法吗? :)
目前还不清楚您实际想要做什么,但更有效的方法可能是将数据视为数据库(因为它就是数据库)。
使用来自 imdb 的数据集来生成所有标题的示例输出,我可以这样做:
sqlite3 '' <<'EOD'
.mode ascii
.separator "\t" "\n"
.import title.basics.tsv basics
.import title.akas.tsv akas
.separator #
.once results_file
select
tconst,primarytitle,startyear||char(10)||
titleid,title,startyear
from
basics join akas on
tconst=titleid
and titletype="movie"
and region="DE"
order by tconst
;
EOD
在我用了五年的笔记本电脑上运行几分钟,并给出输出:
tt0000009#Miss Jerry#1894
tt0000009#Fräulein Jerry#1894
tt0000574#The Story of the Kelly Gang#1906
tt0000574#Die Geschichte der Kelly Bande#1906
tt0001175#Camille#1912
tt0001175#Die Kameliendame#1912
tt0001592#In the Prime of Life#1911
tt0001592#Die Jugendsünde#1911
tt0001592#In the Prime of Life#1911
tt0001592#Jugendsünde#1911
tt0001614#The Four Devils#1911
tt0001614#Die Vier Teufel#1911
tt0001630#Der fremde Vogel#1911
tt0001630#Der fremde Vogel#1911
tt0001711#Jahreszeiten des Lebens#1915
tt0001711#Jahreszeiten des Lebens#1915
tt0001892#Den sorte drøm#1911
tt0001892#Der schwarze Traum#1911
tt0001914#The Devil's Assistant#1913
tt0001914#Asta Nielsen-Neue Serie. VII#1913
您可能想要调整查询。例如:
tt0001592
)