切割并更换 bash

  • 本文关键字:bash bash shell cut
  • 更新时间 :
  • 英文 :


我必须处理一个文件,其中包含这样组织的数据

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

相关内容

  • 没有找到相关文章

最新更新