我重新发布我的问题,希望现在提供一个最小的可重复示例
基本上是对两个具有格式的文件进行合并吗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
因为字符串会重复(我不想要重复的)。