替换循环中的字符串

替换循环中的字符串

我需要按以下方式在文件中添加一些字符串

旧文件:

Real/Test1
Real/Test1
Real/Test2
Real/Test3
Real/Test3
Real/Test4

新文件:

Real/Test1  a1 b1 c1 d1
Real/Test1  a1 b1 c1 d1
Real/Test2  a2 b2 c2 d2
Real/Test3  a3 b3 c3 d3
Real/Test3  a3 b3 c3 d3
Real/Test4  a4 b4 c4 d4

我有一个中间文件,其中第 1 列中包含旧字符串,然后是新字符串,如下所示。

Test1 a1 b1 c1 d1
Test2 a2 b2 c2 d2
Test3 a3 b3 c3 d3
Test4 a4 b4 c4 d4

有人可以帮忙解决这个问题吗?

以我非常原始的知识,我尝试了以下操作:

(同时读取 n1 n2 do set n1 n2 sed -i "s/$n1/$n1 $n2/g" old > 最终完成)

其中“旧”和“中间”输入是上面提到的内容。

多谢 !

答案1

由于您的文件似乎是按连接字段的顺序排序的,因此您可以join相当轻松地使用该命令,例如

join old <(sed 's;^;Real/;' intermediate)

或者(如果您的 shell 不支持进程替换)

sed 's;^;Real/;' intermediate | join old -

前任。

$ sed 's;^;Real/;' intermediate | join old -
Real/Test1 a1 b1 c1 d1
Real/Test1 a1 b1 c1 d1
Real/Test2 a2 b2 c2 d2
Real/Test3 a3 b3 c3 d3
Real/Test3 a3 b3 c3 d3
Real/Test4 a4 b4 c4 d4

答案2

使用你的 gnu awk 尝试类似的操作:

awk -F"[/ ]" 'NR==FNR {a[$1]=$2OFS$3OFS$4;next}$2 in a {print $0,a[$2]}'  intermediatefile oldfile >newfile

答案3

perl -lne '
   @ARGV and $h{$1}=s/(\S+)//r,next;
   s|/(\S+)\K|$h{$1}|;print;
' intermediate.file old.file

结果

Real/Test1 a1 b1 c1 d1
Real/Test1 a1 b1 c1 d1
Real/Test2 a2 b2 c2 d2
Real/Test3 a3 b3 c3 d3
Real/Test3 a3 b3 c3 d3
Real/Test4 a4 b4 c4 d4

解释

  • 使用中间文件(@ARGV > 0),我们使用第一个字段作为键,其余字段作为相应的值来填充哈希。
  • 当我们处理旧文件(@ARGV = 0)时,我们查看斜杠后面的字符串,并使用它来提取哈希值并将其放回当前行。

相关内容