我必须处理一个文件,其中包含这样组织的数据
AAAAA:BB:CCC:EEEE:DDDD
FF:III:JJJ:KK:LLL
MMMM:NN:OOO:PP
etc
列可以有不同的长度,但行始终具有相同的列数。
我希望能够剪切给定行的特定列并将其更改为我想要的值。
例如,我会应用我的命令并将文件更改为
AAAAA:BB:XXXX:EEEE:DDDD
FF:III:JJJ:KK:LLL
MMMM:NN:OOO:PP
我知道如何使用 sed 选择特定行,然后剪切字段,但我不知道如何用我拥有的值替换字段。
谢谢
这是使用awk
执行此操作的一种方法:
以您的示例为例,如果您想替换第 1 行的第 3 个字段:
awk 'BEGIN{FS=OFS=":"} {if (NR==1) {$3 = "XXXX"}; print}' input_file
输入:
AAAAA:BB:CCC:EEEE:DDDD
FF:III:JJJ:KK:LLL
MMMM:NN:OOO:PP
输出:
AAAAA:BB:XXXX:EEEE:DDDD
FF:III:JJJ:KK:LLL
MMMM:NN:OOO:PP
解释:
-
awk
:调用 awk 命令 -
'...'
:用单引号括起来的所有内容都是awk的指令 -
BEGIN{FS=OFS=":"}
:使用:
作为输入和输出的分隔符。FS
代表 字段分隔符。OFS
代表 输出字段分隔符。 -
if (NR==1) {$3 = "XXXX"};
: 如果到目前为止读取的记录数(NR
)为1,则将第三个字段($3
)设置为"XXXX
"。 -
print
:打印当前行 -
input_file
:输入文件的名称。
相反,如果您要完成的只是将文件中出现的所有CCC
替换为XXXX
,只需执行以下操作:
sed -i 's/CCC/XXXX/g` input_file
请注意,这也将替换部分匹配,例如 ABCCCDD
-> ABXXXXDD
这可能对你有用(GNU sed):
sed -r 's/^(([^:]*:?){2})CCC/1XXXX/' file
或
awk -F: -vOFS=: '$3=="CCC"{$3="XXXX"};1' file