如何在給定位置插入逗號?

如何在給定位置插入逗號?

我有一個超過 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

相關內容