awk:在生成数据时保留行顺序并删除重复的字符串(镜像)

awk:在生成数据时保留行顺序并删除重复的字符串(镜像),awk,comparison,batch-processing,Awk,Comparison,Batch Processing,我有两个文本文件 g1.txt alfa beta;www.google.com Light Dweller - CR, Technical Metal;http://alfa.org;http://beta.org;http://gamma.org; g2.txt Jack to ride.zip;http://alfa.org; JKr.rui.rar;http://gamma.org; Nofj ogk.png;http://gamma.org; 我使用这个命令来运行我的awk脚本

我有两个文本文件

g1.txt

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

Jack to ride.zip;http://alfa.org;
JKr.rui.rar;http://gamma.org;
Nofj ogk.png;http://gamma.org;
我使用这个命令来运行我的awk脚本

awk -f ./join2.sh g1.txt g2.txt > "g3.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;
有什么问题吗?

1。行顺序不保守,例如在输出文件g3.txt中,
alfa beta行;www.google.com位于行
灯…
之后。当它应该是第一个时,正如您在g1.txt中看到的那样
2.我在
Light..
行中有许多镜像字符串,您可以在g3.txt中看到

http://alfa.org
http://gamma.org
http://gamma.org
在同一行中重复

我希望行的输出是什么?如下所示:

首先:我尝试实现一个函数,检查一行中是否有丑陋的字符串,例如,您是否在我的行输出
Light Resider-CR,Technical Metal…
中看到该行中有相同的字符串?例如
http://alfa.org
http://gamma.org
?好吧,我不要这个我想要每个字符串,用分隔符括起来;仅存在一次,并且每行仅存在一次。
此规则应仅适用于输出文件g3.txt

Second:我希望g3.txt输出文件中必须保持g1.txt中的原始行顺序。例如,在g1.txt中,我有

alfa beta ... 
Light Dweller ... 
但是我的脚本返回给我一个不同的顺序

Light Dweller ...
alfa beta ... 
我想阻止行的重新排序

我的join2.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]
  }
}
解决方案:

您应该先这样处理
g2.txt

cat join2.awk
开始{
OFS=FS=“;”
}
ARGIND==1{
map[$2]=(map中的$2?OFS的map[$2]:)$1
下一个
}
{
r=0美元;

对于(i=1;iWhy is label Powershell?抱歉,我弄错了,现在我删除了我尝试做的两件事:实现一个函数,检查一行中是否有丑陋的字符串,例如,您是否在我的行输出中看到
Light Resider-CR,Technical Metal…
该行中有相同的字符串?例如
http://alfa.org
http://gamma.org
?好的,我不想要这个。我想要字符串,由分隔符
分隔;
只能出现在行中一次。秒:我想要防止行的重新排序。我想要g3.txt输出文件中必须保持g1.txt中行的原始顺序。例如,在g1.txt中,我有
alfa beta…Light Dweller…
但是我的脚本返回给我一个不同的排序
光居住者…alfa beta…
我想防止重新排序行扫描你原来在
g1.txt中也有重复的URL?太好了!真的谢谢!现在我明白了:)对不起,打扰您了,但是我注意到如果我有这个文本,您的脚本就不起作用了,但是,在我看来,它的格式是相同的。您能帮我理解为什么吗?文本是可以的,可能是因为我需要跳到同一行,也需要带有后缀
&st=30;
&st=60;
&st=90;
等等的文本。。待会儿见我把问题贴在这里,如果想看的话。
#! /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]
  }
}
alfa beta;www.google.com
Light Dweller - CR, Technical Metal;http://alfa.org;http://beta.org;http://gamma.org;;Jack to ride.zip;JKr.rui.rar;Nofj ogk.png