在两个字符串之间查找某些内容,在另一个文件中搜索结果并附加到另一个文件

问题描述 投票:0回答:1

这就是我想要的。 在文件 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

有什么想法吗? :)

sed while-loop grep
1个回答
0
投票

目前还不清楚您实际想要做什么,但更有效的方法可能是将数据视为数据库(因为它就是数据库)。

使用来自 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
© www.soinside.com 2019 - 2024. All rights reserved.