我需要按以下方式在文件中添加一些字符串
旧文件:
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)时,我们查看斜杠后面的字符串,并使用它来提取哈希值并将其放回当前行。