我需要将来自不同文件的文件中的模式替换为输入。
让我们说 file1 内容:
ab 10
bc 20
cd 30
de 40
文件2:
server1;10 feb 2020;disk5;123455678;comment;10;1;desc;abcde3;987654
server1;10 feb 2020;disk6;123455678;comment;10;7;desc;abcde3;987654
server1;10 feb 2020;disk10;123455678;comment;20;4;desc;abcde3;987654
server1;10 feb 2020;disk1;123455678;comment;30;5;desc;abcde3;987654
server1;10 feb 2020;disk9;123455678;comment;20;4;desc;abcde3;987654
server1;10 feb 2020;disk2;123455678;comment;40;6;desc;abcde3;987654
server1;10 feb 2020;disk5;123455678;comment;30;8;desc;abcde3;987654
在这里,作为;
file2 中的分隔符,我想用 file1 中的匹配值替换第 6 列。
IE
server1;10 feb 2020;disk5;123455678;comment;**ab**;1;desc;abcde3;987654
我知道它可能通过awk
/ sed
。你能帮忙吗?注意:我们不使用 GNU 版本的awk
/sed
作为它的AIX
.
假设所有 $6 值都包含在 file1 中,请尝试
本练习的难点在于如何在同一个
awk
程序中处理不同的字段分隔符。使用 GNU
awk
:在这里,我们开始读取第一个文件,在关联数组中填充
pat
我们希望稍后在第 6 列中替换的内容。键是我们替换的东西,值是我们替换它们的东西。当 GNU
awk
读完一个文件时,它会执行该ENDFILE
块,如果它存在的话(还有一个BEGINFILE
块在某些情况下可能有用)。ENDFILE
并且BEGINFILE
就像“本地文件”BEGIN
和END
块。在这里,我们使用
ENDFILE
将输入和输出字段分隔符更改为分号。在读取第二个文件时,我们只是测试第 6 个字段中的数据是否可用作键
pat
,如果是,我们将其值替换为该键的值。打印第二个文件中的所有行,无论是否修改。使用非 GNU
awk
,可以这样做:这有点低效,但它的作用是对于第二个文件中的每一行,它设置
OFS
并FS
重新;
拆分输入。一个稍微更有效(但仍然丑陋)的变体是只为第二个文件中的第一行设置
OFS
和:FS