各行には、同じ数の列を持つ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