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

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

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

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

コマンド

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

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

4回答

1865閲覧

シェルで改行コードなしファイルの特定の位置に固定値を付加したい

k.kawanishi

総合スコア13

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

コマンド

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

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

1クリップ

投稿2020/08/29 08:52

シェルで改行コードなしファイルの特定の位置に固定値を付加したいです。
どのようなコマンドで実行すれば実現できますでしょうか?

入力ファイルは固定長改行なしです。
ファイル名を変更せずに追記のみしたい(不可能であれば新たにファイル作成でも)
LINUX環境です。

〜 処理イメージ 〜

InFile.txt
AAAABBBBCCCCDDDDEEEEFFFFGGGG

(シェルで処理)(ZZZZを付加)

InFile.txt
AAAAZZZZBBBBZZZZCCCCZZZZDDDDZZZZEEEEZZZZFFFFZZZZGGGGZZZZ

上記の例では4byteおきに"ZZZZ"を付加していくイメージです。

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

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

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

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

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

guest

回答4

0

sh

1sed -i 's/..../&ZZZZ/g' InFile.txt

#追記
「4文字ごと」じゃなくて「文字の変わり目と最後」なら、

sh

1sed -i 's/((.)\2*)/\1ZZZZ/g' InFile.txt

投稿2020/08/29 11:10

編集2020/08/31 11:47
otn

総合スコア85766

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

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

hana_yama_san

2020/08/29 11:39 編集

sedの上書き機能を利用したのは秀逸と思います。 私も最初はsedを使おうと思いましたが、早々と諦めました。 ※ま、文字列の変わり目の検出を諦めたというのもありますが、  貴殿のはシンプルな回答でゆえに秀逸と思います。
otn

2020/08/31 11:46

文字の変わり目を追記しました。
guest

0

ベストアンサー

>>4byteおきに
なのか
文字の変わり目
なのかで処理は変わりますが、

grep -o . InFile.txt | awk '{if(NR%4!=0){printf $1}else{printf $1 "ZZZZ"}}END{print ""}'

grep -o . InFile.txt | awk '{if(NR==1){pnr=$1};if($1==pnr){printf $1}else{printf "ZZZZ" $1;pnr=$1}}END{print "ZZZZ"}'

の、どっちかでいけるでしょう。


コメントの続きに書いたら、
>>回答に含めるべき内容は回答に追記しましょう
と怒られてしまいました。

細部まで覚えていないし、工数のこともあるのに
せめて書き込んだ際に怒ってくださいよ。
って、まあシステムごときがそんな判断が無理な事は判っていますが・・

改めて、
ファイルに書き込むには「 > outfile.txt」を使用しましょう。
追記するなら「 >> outfile.txt」にしましょう。

元のファイルを変更するやり方でなくて申し訳ない。
sed -i 方式なら元ファイルを変更できます。


投稿2020/08/29 11:05

編集2020/08/31 12:14
hana_yama_san

総合スコア923

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

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

hana_yama_san

2020/08/29 11:33

なぜか、検証環境で「awk -F''」が期待通りの動作をしなかったので、 泣く泣く「grep -o .」を使いましたが、実は不本意です。
k.kawanishi

2020/08/31 03:57

ありがとうございます。こちらをファイル出力するにはどうしたら良いでしょうか。
hana_yama_san

2020/08/31 12:17

>>こちらをファイル出力するにはどうしたら良いでしょうか。 と言う事の回答をこのコメントに記載したら、 「回答に追記せよ」と、怒られました。 なんだかなー
guest

0

めんどくさい方法で

bash

1fold -w 4 InFile.txt >tmp1 2 3seq -f "ZZZZ%g" `wc -l tmp1` | tr -d '[:digit:]' >tmp2 4 5paste tmp1 tmp2 | tr -d "\n" >InFile.txt

投稿2020/08/29 12:38

takasima20

総合スコア7460

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

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

takasima20

2020/08/29 12:41

viの制御文作ってくわせてもいいけど長さがわからなかったので
hana_yama_san

2020/08/29 13:59

こんなの出ましたが・・ [user@host ~/programing/shell_work/awk]$ fold -w 4 InFile.txt >tmp1 [user@host ~/programing/shell_work/awk]$ seq -f "ZZZZ%g" `wc -l tmp1` | tr -d '[:digit:]' >tmp2 seq: invalid floating point argument: tmp1 [user@host ~/programing/shell_work/awk]$ [user@host ~/programing/shell_work/awk]$ [user@host ~/programing/shell_work/awk]$ paste tmp1 tmp2 | tr -d "\n" >InFile.txt [user@host ~/programing/shell_work/awk]$ [user@host ~/programing/shell_work/awk]$ [user@host ~/programing/shell_work/awk]$ cat InFile.txt AAAA BBBB CCCC DDDD EEEE FFFF GGGG [user@host ~/programing/shell_work/awk] あと、仮にうまく動くにしても中間ファイルは削除しないと・・
guest

0

自分でもださいとは思いますが頭が回らない状態なので、

bash

1$ cat InFile.txt | fold -s4 | awk '{print $0, "ZZZZ"}' | awk '{printf $0}' | sed 's/ //g' > InFile.txt 2$ cat InFile.txt 3AAAAZZZZBBBBZZZZCCCCZZZZDDDDZZZZEEEEZZZZFFFFZZZZGGGGZZZZ

投稿2020/08/29 10:27

編集2020/08/29 10:33
ikapy

総合スコア1167

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

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

hana_yama_san

2020/08/29 11:15

これは動きません。 bashだとInfile.txtは空になります、 tcshで実行すると AAAAZZZZZZZZZZZZBBBBZZZZZZZZZZZZCCCCZZZZZZZZZZZZDDDDZZZZZZZZZZZZEEEEZZZZZZZZZZZZFFFFZZZZZZZZZZZZGGGGZZZZZZZZZZZZ と、訳のわからん状態になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問