如何在给定位置插入逗号?

如何在给定位置插入逗号?

我有一个超过 100MB 的文本文件,其中每一行都有相同的列数:

Column No.: 0 1 2 3 4 5 6
            d x c c s b c
            .............

我想,在给定的位置添加。例如,location = 2, 3, 5

期望的输出是:

Column No.:  0 1 2  3  4 5  6
             d x c, c, s b, c
             .............

位置文件将是文本或者数据集文件

2
3
5

文本文件必须有分隔符。

更新:

样本数据

在此输入图像描述

  • 注意:换行符是我想放置分隔符的地方
  • 列号是距行首的字节偏移量

答案1

使用Sed。

请注意,您不会使用 0 个索引位置,而是从 1 开始。因此,我增加了您提供的数字。

另外,您必须从后到前,因为一旦更改第一个,列位置就会发生变化。所以像这样使用 Sed :

sed 's/./&,/6;s/./&,/4;s/./&,/3'

例子:

$ echo dxccsbc
dxccsbc
$ echo dxccsbc | sed 's/./&,/6;s/./&,/4;s/./&,/3'
dxc,c,sb,c
$ 

  • Sed 中的命令s用于替换。
  • 该模式.匹配任何单个字符。
  • 替换文本中的&表示“匹配的文本”,逗号是字面逗号。
  • 最后一个后面的数字标志/表示仅在该行的“第 n”个匹配项上执行替换。

如果你想成为真的奇特的是,使用 Bash 大括号扩展来创建 Sed 命令:

$ echo dxccsbc | sed '-es/./&,/'{6,4,3}
dxc,c,sb,c

但这只是锦上添花,并且可能会令人困惑,除非您非常了解 Sed 和 Bash。 :)


如果您想从单独的文件中提取职位列表(正如您在问题中实际显示的那样),您可以这样做:

sed -f <(sort -rn positionsfile | sed -n 's:^[1-9][0-9]*$:s/./\&,/&:p') file

请注意,这是 Bash 特定的,因为它使用非 POSIX 的进程替换语法。另请注意,我已经将其变得非常强大,但实际上并非如此数字位置文件中的(不以 0 开头的)将被丢弃。

检测结果:

$ cat file 
abcdefg
ABCDEFG
abcdelaksjdflkjsdflli
sdlfihsdlfkj
$ cat positionsfile 
2
15
5
7something
01
not a number
$ sed -f <(sort -rn positionsfile | sed -n 's:^[1-9][0-9]*$:s/./\&,/&:p') file
ab,cde,fg
AB,CDE,FG
ab,cde,laksjdflkj,sdflli
sd,lfi,hsdlfkj
$ 

答案2

perl

#!/usr/bin/env perl

my @pos;

while (<>)
    { push @pos, 1 + int; }
continue
    { last if eof; }

@pos = sort { $b cmp $a } @pos;

while (<>) {
    for my $k (@pos)
        { s/^.{$k}\K/,/; }
    print;
}

像这样运行它:

script.pl positions.txt file.txt

相关内容