与えられた場所にカンマを挿入するには?

与えられた場所にカンマを挿入するには?

各行には、同じ数の列を持つ100 MBを超えるテキストファイルがあります。

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

これはPOSIXではなくプロセス置換構文を使用するため、Bashにのみ当てはまります。また、私はこれを非常に強力にしましたが、実際にはそうではありません。数字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

関連情報