3

我必须处理一个像这样组织的数据的文件

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 选择特定行,然后剪切该字段,但我不知道如何用我拥有的值替换该字段。

谢谢

4

2 回答 2

6

这是一种方法awk

以您的示例为例,如果您想替换第一行的第三个字段:

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:输入文件的名称。

相反,如果您尝试完成的只是将文件中所有出现的 替换为CCCXXXX只需执行以下操作:

sed -i 's/CCC/XXXX/g` input_file

请注意,这也将替换部分匹配项,例如ABCCCDD->ABXXXXDD

于 2012-11-27T16:49:42.270 回答
1

这可能对您有用(GNU sed):

sed -r 's/^(([^:]*:?){2})CCC/\1XXXX/' file

或者

awk -F: -vOFS=: '$3=="CCC"{$3="XXXX"};1' file
于 2012-11-27T16:58:25.470 回答