与格式;字符串;合并

与格式;字符串;合并

我重新发布我的问题,希望现在提供一个最小的可重复示例

基本上是对两个具有格式的文件进行合并吗NAME;URL;
不完全是,字符串不需要是 URL,只要相同的字符串用分隔符括起来就足够了;,即;STRING;

您能否提到您想要在两个文件之间匹配哪些字段或内容? 足以匹配两个文件中分号分隔符之间的相同字符串。例如,如果;aaaa;两个文件中都有,那么您需要携带 二.txt;aaaa;位于的整行进入one.txt 的一行中,你可以找到相同的字符串,即;aaaa;

我有 2 个文本文件

一.txt

alfa beta;https://123.org/a/in.ph?shw=297585;
Light Dweller;https://123.org/a/in.ph?shw=3869;
Imp - Alp;https://123.org/a/in.ph?shw=340249;

二.txt

Link;1996 7.zip;https://yd.k/d/BbNUb-2yhVmVnw;https://123.org/a/in.ph?shw=3869;https://123.org/a/in.ph?shw=3869;
Link;Moonblo (Tape)_123.zip;https://yd.k/d/57i;https://123.org/a/in.ph?shw=3869;
Link;Moonblo(Demo) [1996].rar;https://yd.k/d/A7U;https://123.org/a/in.ph?shw=3869;

我尝试生成此预期的输出文本

alfa beta;https://123.org/a/in.ph?shw=297585;
Light Dweller;https://123.org/a/in.ph?shw=3869;Link;1996 7.zip;https://yd.k/d/BbNUb-2yhVmVnw;Link;Moonblo (Tape)_123.zip;https://yd.k/d/57i;Link;Moonblo(Demo) [1996].rar;https://yd.k/d/A7U;
Imp - Alp;https://123.org/a/in.ph?shw=340249;

但是脚本截断字符串并生成错误的输出,因此某些东西不起作用:

alfa beta;https://123.org/a/in.ph?shw=297585;;;
Light Dweller;https://123.org/a/in.ph?shw=3869;;;
Imp - Alp;https://123.org/a/in.ph?shw=340249;;;

我使用了 2 个脚本:join.awk(用于保留行顺序)

BEGIN {
  OFS=FS=";"
}
ARGIND == 1 {
   map[$2] = ($2 in map ? map[$2] OFS : "") $1
   next
}
{
   r = $0;
   for (i=1; i<=NF; ++i)
      if ($i in map)
         r = r OFS map[$i]
   $0 = r
}
1

和 join.sh (主脚本)

#! /usr/bin/awk  -f

BEGIN {
  OFS=FS=";"
  C=0;
}
{
  if (ARGIND == 1) {
     X = $NF
     T0[$NF] = C++
     $NF = ""
     if (T1[X]) {
        T1[X] = T1[X] $0
     } else {
        T1[X] = $0
     }
  } else {
     X = $NF
     T0[$NF] = C++
     $NF = ""
     if (T2[X]) {
        T2[X] = T2[X] $0
     } else {
        T2[X] = $0
     }
  }
}

END {
  for (X in T0) {
    # concatenate T1[X] and X, since T1[X] ends with ";"
    print T1[X]  X, T2[X]
  }
}

我是这样使用的

awk -f join.awk two.txt one.txt > "three.txt"

允许我生成正确输出的文本文件示例:

例如,如果我有这两个文件文本,运行脚本后,我可以得到正确的输出

一.txt

alfa beta;www.google.com
Light Dweller - CR, Technical Metal;http://alfa.org;http://beta.org;http://gamma.org;

二.txt

Jack to ride.zip;http://alfa.org;
JKr.rui.rar;http://gamma.org;
Nofj ogk.png;http://gamma.org;

生成输出的命令(例如 three.txt)

awk -f join.awk two.txt one.txt > "three.txt"

正确输出,这是预期的示例输出示例

Light Dweller - CR, Technical Metal;http://alfa.org;http://beta.org;http://gamma.org;;Jack to ride.zip;http://alfa.org;JKr.rui.rar;http://gamma.org;Nofj ogk.png;http://gamma.org;
alfa beta;www.google.com;

但在我的处境下我不能这样做,我的两个文本文件阻止我这样做,我不明白为什么

增加了获取预期输出的逻辑

如果文本文件 two.txt 中的一行中有一个与文件 one.txt 中相同的字符串,则文本文件 two.txt 的整行必须出现在文本文件 one.txt 的行上。但是,所有这一切都是通过生成第三个名为 three.txt 的文件而不是修改 one.txt 文件来实现的。完成此操作后,必须消除该行和任何其他行中存在的重复项。

解释和应用

例如,您可以看到用分号分隔符括起来的字符串;

http://gamma.org

出现在两个文本文件中。在 one.txt 中,该字符串出现在第二行;而在 two.txt 中,该字符串出现在第二行和第三行。

three.txt 文件有什么特别之处?

  • 具有共同字符串的行将分组到一行中,并且在整个文本文件中仅位于一行中。因此,字符串

    http://gamma.org

它只会出现一次,不能出现在不同的行上。

  • 删除重复项,例如字符串

    http://gamma.org

它只在同一行出现一次,换句话说,我们不能有这样的事情

http://gamma.org;JKr.rui.rar;http://gamma.org

因为字符串会重复(我不想要重复的)。

相关内容