【问题标题】:Cut and replace bash剪切和替换 bash
【发布时间】:2012-11-27 16:44:15
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 考虑使用sedawk
  • 一个简单的sed s/val/rep/ 就可以了。

标签: bash shell cut


【解决方案1】:

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

如果您想要完成的只是将文件中所有出现的CCC 替换为XXXX,只需执行以下操作:

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

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

【讨论】:

  • 太棒了,这正是我需要的!
  • 只有一件事,如果我使用这个命令,它会输出修改后的版本,文件中的原始版本如下所示:
  • AAAAA:BB:XXXX:EEEE:DDDD FF:III:JJJ:KK:LLL MMMM:NN:OOO:PP AAAA:BB:CCC:EEEE:DDDD FF:III:JJJ:KK: LLL MMMM:NN:OOO:PP
  • 您能否编辑您的原始问题以包含您运行的实际确切命令和输出? cmets 丢弃格式。
  • 这个解决方案写得更习惯:awk 'NR==1{$3="XXXX"}1' FS=: OFS=: input_file
【解决方案2】:

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

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

awk -F: -vOFS=: '$3=="CCC"{$3="XXXX"};1' file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-21
    • 2018-11-30
    • 2015-07-21
    • 1970-01-01
    • 2015-11-22
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多