【问题标题】:Inserting a char at particular index of line(s) in a file using awk or sed使用 awk 或 sed 在文件中的特定行索引处插入字符
【发布时间】:2015-10-22 10:14:11
【问题描述】:

是否有 Linux 方法(awk、sed、grep 等)在文件中每一行的特定索引处插入一个字符?

例如下面是file.txt的内容

0067011990999991950051507004+68750+023550FM-12+038299999V0203301N00671220001CN9999999N9+00001+99999999999
0043011990999991950051512004+68750+023550FM-12+038299999V0203201N00671220001CN9999999N9+00221+99999999999

我想在 file.txt 中每一行的给定索引(比如 15、19、88 和 93)处插入一个逗号,以便生成的结果如下:

006701199099999,1950,051507004+68750+023550FM-12+038299999V0203301N00671220001CN9999999N9+,00001,+99999999999
004301199099999,1950,051512004+68750+023550FM-12+038299999V0203201N00671220001CN9999999N9+,00221,+99999999999

【问题讨论】:

  • 可以将 dd 与 conv=notrunc 一起使用
  • @amdixon 感谢您的建议。我是stackoverflow的新手。下次会记住格式。
  • 也许这个纯粹的bash 解决方案可以提供帮助:while read -r line; do echo "${line:0:15},${line:15:4},${line:19:69},${line:88:5},${line:93}"; done < file.txt

标签: regex linux bash awk sed


【解决方案1】:

sed 中最简单的

sed 's/\(.\{93\}\)/&,/;s/\(.\{88\}\)/&,/;s/\(.\{19\}\)/&,/;s/\(.\{15\}\)/&,/' YourFile

顺序很重要,否则您需要记住为下一次更改添加的字符

你可以一次完成,但需要一些解释

sed 's/\(.\{15\}\)\(.\{4\}\)\(.\{69\}\)\(.\{5\}\)/\1,\2,\3,\4/' YourFile

【讨论】:

  • 如果您使用的是&,则不需要()
  • 谢谢!有用。你为我节省了很多时间。谢谢。
  • @123 不,它保留了我首先做的复杂版本。你是对的,
【解决方案2】:

Perl 解决方案:

perl -ne '$l = $_;
          substr $l, $_, 0, "," for reverse 15, 19, 88, 93;
          print $l' < input > output

我使用reverse,因为您需要从右开始 - 否则,每次插入后,所有剩余索引都必须递增。

【讨论】:

    【解决方案3】:

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

    sed 's/./&,/93;s/./&,/88;s/./&,/19;s/./&,/15' file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 2011-12-21
      • 2011-05-17
      • 1970-01-01
      • 2017-05-25
      • 2013-10-08
      相关资源
      最近更新 更多