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

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

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

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

Q&A

解決済

5回答

639閲覧

シェルスクリプトの指定回数処理について

sho88

総合スコア19

sh

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

0グッド

0クリップ

投稿2019/04/15 07:33

以下の情報が記載されたファイル(sample.txt)が有ります。

A⇒5回
B⇒3回

というように、右の数字の数だけ左のアルファベットをファイル(result.txt)にリダイレクトしたいです。

whileやfor文を使って検討していますが、なかなかいい案が浮かばないため、ご相談させていただきます。
どうぞ宜しくお願い致します。

sample.txt
+++++++++++++++++++++++++++++++++
[**@**** test]$ less sample.txt
A,5
B,3
C,2
D,1
E,5
F,3
G,2
+++++++++++++++++++++++++++++++++

実現したい内容
result.txt
+++++++++++++++++++++++++++++++++
[**@**** test]$ less result.txt
A
A
A
A
A
B
B
B
C
C
<<略>>
G
G
+++++++++++++++++++++++++++++++++

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

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

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

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

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

guest

回答5

0

awk使わずにやってみました

cat sample.txt | sed -e 's/^/printf "%0.s/' -e 's/,/\n" {1../' -e 's/$/}/' | sh

投稿2019/04/15 14:29

moonphase

総合スコア6621

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

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

sho88

2019/04/20 13:15

moonphase様、ご教示いただきありがとうございます。sedでも可能なんですね。どうもありがとうございました。またどうぞよろしくお願いいたします。お礼が遅くなってすみませんでした。
guest

0

動作確認してませんので動かなかったらすんません

#!/bin/sh inf=sample.txt outf=result.txt rm $outf touch $outf cat $inf | tr ',' ' ' | \ while read c n do seq -f "$c%g" $n | tr -d "[:digit:]" >>$outf done

投稿2019/04/15 14:09

takasima20

総合スコア7458

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

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

takasima20

2019/04/15 22:45

%g 指定しなかったら tr いらんかったか?
sho88

2019/04/20 13:14

takasima20様、ご教示いただきありがとうございます。無事解決いたしました。お礼が遅くなってすみませんでした。
guest

0

Bash

1while IFS=, read a b 2do 3 for((i=0;i<b;i++)) 4 do echo "$a" 5 done 6done < sample.txt > result.txt

投稿2019/04/15 13:59

otn

総合スコア84499

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

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

sho88

2019/04/20 13:12

otn様、ご教示頂きありがとうございます。またいつも回答いただき感謝いたします。また質問させて頂くこともあると思いますが、どうぞよろしくお願いいたします。お礼が遅くなって申し訳ございませんでした。
guest

0

awkのみでできます。

bash

1$ awk -F, '{for(i=0;i<$2;i++){print $1}}' sample.txt > result.txt

個人的には下記のコードのほうが好きですが……

bash

1$ cat sample.txt | awk -F, '{for(i=0;i<$2;i++){print $1}}' | tee result.txt

投稿2019/04/15 10:45

amanoese

総合スコア132

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

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

otn

2019/04/15 13:45

> 個人的には下記のコードのほうが好きですが…… 下のようなコードをよく見かけるのですが、リダイレクトで済むのに何故catとパイプを好むのでしょうか?
amanoese

2019/04/15 15:28 編集

趣向になってしまうため言語化するのは難しいですが、 「Unix哲学」や「ユニケージ開発手法」の考えが大きく影響しているのだと思います。 今回の例で具体的にいうと 1. パイプごとに処理が明確に分かれていて可読性が高い catでファイルを読み込み、awkで処理し、teeで出力しているのが明確です。 また左から右に処理を追うことができるのも個人的に可読性が高く感じます。 $ awk '{print $0}' input.txt > output.txt $ cat input.txt | awk '{print $0}' > output.txt の2つのコードでは下のほうが処理が追いやすく感じます。 左から右に処理を書くだけなら、パイプを使わずに下記のようにすることもできますが…… $ <input.txt awk '{print $0}' > output.txt 2. パイプによる最適化の恩恵を受けられる可能性がある。 今回のコードはawkを使用してるため(awkはパイプの入力をバッファしてしまう)考慮しなくてもよいですが… もし、変換の処理がバッファしないコマンド(sedやtr)などであった場合は、各プロセスが並列実行され高速化される可能性があります。 3. 修正やリファクタリングが楽(スケールしやすい?)  例えば今回のsample.txtはデータ量が少ないため短時間で実行が終わりますが、もしsample.txtが100GBのテキストファイルで処理に時間がかかる場合は下記のように修正するかもしれません。  $ cat sample.txt | xargs -P4 -i sh -c "echo {} | awk -F, '{for(i=0;i<$2;i++){print $1}}'" | tee result.txt    このような修正をする際に、catとteeの処理を変えずにawkの部分だけ変更すればよいと明確にわかりやすいのでリファクタリングが楽です。 上記の理由がありますが、今回の場合だと「3」が割合が大きいです。 質問者の方が実際にやりたい処理がもっと複雑なコードの一部であり、拡張性に高いほうを求めている可能性があるかもしれないからです。 もし仕事で使用するコードであればワンライナーであろうと何度も修正する可能性を考えてしまいます。 シェルスクリプトやLinuxの専門家では無いで間違っている部分があると申し訳ないですが、よろしくお願いします。
amanoese

2019/04/15 15:26

teeコマンドについては、もしリダイレクト先のファイルがroot権限であった場合でも簡単な修正で済むのがポイント高いですね。(セキュリティ的な話は置いておいて) $ cat sample.txt | awk -F, '{for(i=0;i<$2;i++){print $1}}' | sudo tee result.txt
otn

2019/04/15 15:30

なるほど。1,2はさておき、3は分かります。 ありがとうございました。 私の回答のように、複合文での複数行コマンドの場合は、cat ~ | が良い気がしたのですが、この質問をした行きがかり上、リダイレクトで書いてしまいました。
sho88

2019/04/20 13:07

amanoese様、ご教示頂きありがとうございました。awkのみで処理が可能なんですね。日頃からawkはよく利用していたのですが、勉強不足が否めません。今度ともどうぞよろしくお願いいたします。
guest

0

ベストアンサー

for x in $(cat sample.txt ) do moji=$(echo ${x} | awk -F, '{print $1}') range=$(echo ${x} | awk -F, '{print $2}') for y in $(seq 1 ${range}) do echo $moji done done > result.txt cat result.xt A A A A A B B B C C D E E E E E F F F G G

投稿2019/04/15 07:52

scsi

総合スコア2840

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

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

sho88

2019/04/20 13:02

scsi様、ご教示頂きありがとうございました。やりたかった処理ができました。 また相談することもあるかと思いますが、どうぞよろしくお願いいたします。 お礼が遅くなって申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問