sed 从第二个文件重建清单

问题描述 投票:0回答:1

我想替换与另一个文件内容匹配的some行(不是全部)的文件内容:

File1 是具有以下格式的清单(数千行):

...    
f 755 myself mygroup /opt/app/fileabc a991a508b1166fb14448f303bba7662287b7a827f3761f
f 555 myself mygroup /opt/app/filedef 3bba766209dcd21a0793190b287b7a8a508b1114448f30
...

最后一部分是前面引用的文件的 sha256sum。 我重新计算并重新计算其中一些文件的 sha256sum,最终结果为 文件2:

...
645278b945d6b52c48a1851765c72a8eb1e7030c5ee /opt/app/fileabc
1765c72a8eb1e703aa3ac3ba01d2160c0c83df464ee /opt/app/filedef
...

显然具有相同的文件名,但 sha256sum 不同。 文件 1 有 1k 行大,而文件 2 只有 155 行更新。

如何让

file1
更新为
file2
的内容? 该命令最终有 155k 行,其中添加了很多次相同的行,甚至没有预期的替换:

while read sha file; do
    sed "s;$file (\w+);$file $sha;" file1
done <file2
shell filter sed while-loop combine
1个回答
1
投票

这可能是您想要使用任何 awk 执行的操作:

$ awk 'NR==FNR{ sha[$2]=$1; next } $5 in sha{ $6=sha[$5] } 1' file2 file1
f 755 myself mygroup /opt/app/fileabc 645278b945d6b52c48a1851765c72a8eb1e7030c5ee
f 555 myself mygroup /opt/app/filedef 1765c72a8eb1e703aa3ac3ba01d2160c0c83df464ee

上面假设您的文件名或其他任何地方都没有空格,除了示例中显示的位置。

© www.soinside.com 2019 - 2024. All rights reserved.