質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

Q&A

解決済

3回答

970閲覧

文字列の抽出・切り出し・挿入

piko22

総合スコア8

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

0グッド

2クリップ

投稿2020/06/03 12:07

やりたいこと

awkなどのコマンドを用いて文字列を一部切り取り、別の文字列を挿入したい。

文字列の例

abc

NNNNNNNNNNNNNNNN...(Nが約20万文字続く)...NNACGTACGTACGT..(121MB分続く)

といった文字列です。
改行は一行目のCの後のみです。この文字列のN 20万文字のうち任意の場所を45306文字削り、そこに別の45306文字を挿入したいと考えています。なお、Nは121MBのファイル中数万文字単位の集団で散在しており、一番最初に出てくる「N」集団から45306文字削る指定のしかたを探しております。二行目の最初の文字は「N」で確定しているのでそこから45306文字削るのが早いのかな、と考えています。
文字列を格納しているファイルは、元のファイル・挿入したい文字列のファイル共に .txtです。
ややこしくて申し訳ないです。
初心者で知識が不足しており、困っております。どうかご教授頂けますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hidezzz

2020/06/03 12:51

質問の最初の方は任意の場所を置き換えたいとなっていますが、途中から先頭から置き換えるので構わないと書いてあります。 最終的には任意の場所を置き換えたいが、とりあえずの取っ掛かりとして先頭を置き換える方法が知りたいという意味でしょうか?(最終的には、やはり任意の場所を置き換えたい?) 任意の場所を置き換える場合、置き換え対象はNが続いている部分の範囲内で行いたいということでしょうか?
piko22

2020/06/03 13:17

ややこしくてすみません。 先頭から始まる20万の「N」の集団の中でしたら置き換える場所ばどこでも良い、という条件で、コマンドを考えるのであれば先頭から45306文字分のNを削るのが早いだろうか、、、と考えた次第です。「N」の集団はファイル中に散在しているので『「N」を45306文字削る』の条件ですと、様々な場所が削れる可能性が考えられるので先頭からいくつと指定した方が確実だろうか、、、という憶測です。 NNNNN [20万(この集団中から45306文字削りたい)] ...NNN....ACGTACGT......NNNNN [30万]....ACGTACGTACG...... といったファイルになっています。
guest

回答3

0

ベストアンサー

ファイルサイズは極端に小さいですがn.txtが元ファイルで、x.txtが置き換えデータが入ってるファイルのつもりです。いずれも2行目にデータが入っているものとしています。
文字数の都合で実際のサイズの場合の実行結果は載せませんが、手元ではそれっぽく置き換え出来てることは確認してます。
(GNU Awk 4.1.4で試しました。他の実装だと極端に長い行が取り扱えないものがあるかもしれません。)

terminal

1$ cat n.txt 2abc 30123456789 4$ cat x.txt 5abc 6xyz 7$ awk '{if(F==0){if(FNR==2){rep=$0;len=length(rep)};next}else{if(FNR==1){print}else{print rep substr($0,len+1) }}}' x.txt F=1 n.txt > n2.txt 8$ cat n2.txt 9abc 10xyz3456789

投稿2020/06/03 14:02

編集2020/06/03 14:06
hidezzz

総合スコア1248

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

awkで、FIELDWIDTHSを使うと、行を指定したバイト単位で区切って扱うことが出来ます。

FIELDWIDTHS="1000 100 2000000000"で、「1000バイト、100バイト、残り」に分割できるので、$2に100バイトの文字列を代入すると、$0が「1001バイト目から100バイトが書き換わったデータ」になります。

投稿2020/06/03 13:49

otn

総合スコア85778

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

推奨していない質問|teratail(テラテイル)

推奨していない質問コードをください・デバッグしてください等の丸投げの質問

問題や質問は実際に調査や作業に取り組み、具体的なところで生まれると考えるためです。
まずは実際に作業に取り組み、つまづいたところで投稿をしてみてください。

というわけで具体的なコードは示しませんが、複数のファイルに格納されている文字列データを元に切ったり貼ったりしたいということであれば、最有力はawkよりもperlです。

投稿2020/06/03 12:46

KojiDoi

総合スコア13692

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問