
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
.............
ロケーションファイルは文章またはcsvファイル
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
は置換用です。 - パターンは
.
任意の 1 文字に一致します。 - 置換テキスト内のは
&
「一致したテキスト」を意味し、カンマは文字通りのカンマです。 - 最後の数値フラグは、
/
行内の「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