- ベストアンサー
テキストを処理するプログラム
- Linuxでテキストを処理する方法について教えてください。
- A.txtとB.txtの値を組み合わせて出力する方法を教えてください。
- プログラムの初心者ですが、テキストの処理方法について教えてください。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
#2です。 >■なので期待している結果は下記の通りです。 >kato198636 >kato1986 >kato36 >kato >kato19860306 >kato0306 >198636kato >1986kato >36kato >kato >19860306kato >0306kato >以降megumiとmeguchan等々 以下のようにしてください。 -------------------------------------------- $file_a = shift(@ARGV); $file_b = shift(@ARGV); open FHA,$file_a or die("can't open $file_a"); @data_a = (); while($line=<FHA>){ chomp($line); push @data_a,$line } close FHA; open FHB,$file_b or die("can't open $file_b"); @data_b = (); while($line=<FHB>){ chomp($line); push @data_b,$line } close FHB; foreach $da (@data_a){ printf("%s%d%d%d\n",$da,$data_b[0],$data_b[1],$data_b[2]); printf("%s%d\n",$da,$data_b[0]); printf("%s%d%d\n",$da,$data_b[1],$data_b[2]); printf("%s\n",$da); printf("%s%04d%02d%02d\n",$da,$data_b[0],$data_b[1],$data_b[2]); printf("%s%02d%02d\n", $da,$data_b[1],$data_b[2]); printf("%d%d%d%s\n",$data_b[0],$data_b[1],$data_b[2],$da); printf("%d%s\n",$data_b[0],$da); printf("%d%d%s\n",$data_b[1],$data_b[2],$da); printf("%s\n",$da); printf("%04d%02d%02d%s\n",$data_b[0],$data_b[1],$data_b[2],$da); printf("%02d%02d%s\n",$data_b[1],$data_b[2],$da); } --------------------------------------------
その他の回答 (6)
- tatsu99
- ベストアンサー率52% (391/751)
#2です。 B.txtが3行の場合用に書き換えました。 --------------------------------------- $file_a = shift(@ARGV); $file_b = shift(@ARGV); open FHA,$file_a or die("can't open $file_a"); @data_a = (); while($line=<FHA>){ chomp($line); push @data_a,$line } close FHA; open FHB,$file_b or die("can't open $file_b"); $i = 0; @data_b = (); while($line=<FHB>){ chomp($line); push @data_b,$line } close FHB; foreach $da (@data_a){ printf("%s%d%d%d\n",$da,$data_b[0],$data_b[1],$data_b[2]); printf("%s%d\n",$da,$data_b[0]); printf("%s%d%d\n",$da,$data_b[1],$data_b[2]); printf("%s%02d%02d\n", $da,$data_b[1],$data_b[2]); printf("%s%04d%02d%02d\n",$da,$data_b[0],$data_b[1],$data_b[2]); } -------------------------------------------------------------------- これで同じ結果が得られます。
- MillenniuM
- ベストアンサー率58% (42/72)
にぎやかしで。 bash zsh とも動きます。プロセス置換を使ってるので ワンライナとは言い難いですが。適当に改行入れています。 B.txt が5行のバージョンです。もしゼロ詰めを自動でしたいなら、 スクリプトを書いたほうが良いです。 while read l;do paste <(for i in $(seq 5);do echo $l;done) \ <(sed -n 'p;h;n;N;s/\n//p;G;s/\(.*\)\n\(.*\)/\2\1/p;n;N;s/\n//p;G;s/\(.*\)\n\(.*\)/\2\1/p' B.txt); done<A.txt
- tatsu99
- ベストアンサー率52% (391/751)
#2です。rubyで作りました。 以下のスクリプトを作ってください。 ----------------------------------------- file_a = ARGV.shift file_b = ARGV.shift data_a = Array.new File.open(file_a) do |file| file.each_line do |line| data_a << line.chomp end end data_b = Array.new File.open(file_b) do |file| file.each_line do |line| data_b << line.chomp.to_i end end data_a.each do |da| printf("%s%d%d%d\n",da,data_b[0],data_b[1],data_b[2]) printf("%s%d\n",da,data_b[0]) printf("%s%d%d\n",da,data_b[1],data_b[2]) printf("%s%02d%02d\n",da,data_b[1],data_b[2]) printf("%s%04d%02d%02d\n",da,data_b[0],data_b[1],data_b[2]) end --------------------------------------------------------- 上記のファイル名を goo1.rb とします。 このスクリプトをA.txt B.txtと同じディレクトリにおいてください。 そこで、 ruby goo1.rb A.txt B.txt と入力します。 望んだ結果が画面に表示されます。 以下、実行結果です。 --------------------------------------------- kato198636 kato1986 kato36 kato0306 kato19860306 megumi198636 megumi1986 megumi36 megumi0306 megumi19860306 meguchan198636 meguchan1986 meguchan36 meguchan0306 meguchan19860306 ----------------------------------------- 尚、B.txtが3行まであればOKです。(4,5行は使いません)
- notnot
- ベストアンサー率47% (4900/10358)
B.txtの利用方法が不規則に見えます。どういう風に使うのか、日本語できちんと書けますか?
お礼
返信ありがとうございます!めぐみです。 B.txtについてですが本当は以下のようにしたかったのです。 先の質問しましたB.txtが下記の場合 1986 3 6 2行目の”3”と3行目”6”については、 1~9の数字の場合 3と6だけを単純に付け加える以外に 0を付けて03、06にもしたいです。 但し、10、11、12の場合には“0”を付け加える必要は無いようにしたいです。 なので例えばB.txtの内容が下記のような場合、 1986 11 6 以下のように出力したいです。 kato1986116 kato1986 kato116 kato1106 kato19861106 megumi以降も上記(kato)同様に出力したいです。 なので、本当は 03,06というのは無いようにしたいです。 B.txtは3行一組です。なので下記のように6行、9行、12・・・となります。 1986 11 6 1988 3 12 1990 8 15 以上がB.txtの利用方法の説明となりますがご理解頂けたでしょうか。 説明下手で申し訳ありませんが何卒よろしくお願いいたします。
- tatsu99
- ベストアンサー率52% (391/751)
#1のかたがいわれるように、perl,ruby,pythonなどで、処理をするのがかんたんでしょう。 もし、perlで作った場合は、以下のようになります。 下記のスクリプトを作って下さい。 ------------------------------------------ $file_a = shift(@ARGV); $file_b = shift(@ARGV); open FHA,$file_a or die("can't open $file_a"); $i = 0; @data_a = (); while($line=<FHA>){ chomp($line); $data_a[$i++] = $line; } close FHA; open FHB,$file_b or die("can't open $file_b"); $i = 0; @data_b = (); $i = 0; while($line=<FHB>){ chomp($line); $data_b[$i++] = $line; } close FHB; foreach $da (@data_a){ print $da,$data_b[0],$data_b[1],$data_b[2],"\n"; print $da,$data_b[0],"\n"; print $da,$data_b[1],$data_b[2],"\n"; print $da,$data_b[3],$data_b[4],"\n"; print $da,$data_b[0],$data_b[3],$data_b[4],"\n"; } ------------------------------------------ 上記のファイル名にgoo1.pl と名前をつけてください。 そして、以下のコマンドを実行してください。 perl goo1.pl A.txt B.txt 望んだ結果が画面に表示されます。 尚、goo1.pl A.txt B.txtは同じディレクトリ下に置いてください。 そして、そのディレクトリ下で、上記のコマンドを実行してください。 以下、実行結果です。 ---------------------------------------- kato198636 kato1986 kato36 kato0306 kato19860306 megumi198636 megumi1986 megumi36 megumi0306 megumi19860306 meguchan198636 meguchan1986 meguchan36 meguchan0306 meguchan19860306 ------------------------------------ 不明点があれば、補足して下さい。 実行環境は以下の通り CentOS release 6.3 (Final) Kernel 2.6.32-279.el6.x86_64 on an x86_64 This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi
お礼
早速の返信ありがとうございます!めぐみです。 windowsにPrelをインストールして早速試してみました。 C.txtに出てきた結果ですが"KATO"の部分だけで以下に説明させて頂きます(megumiとmeguchanは割愛)。 私の説明が悪かったようで本当に申し訳ありませんでした。 ●tatsu99さまから頂いたプログラムの結果は下記のようになります。 kato198636 kato1986 kato36 kato kato1986 以降megumiとmeguchan等々 ●期待している結果は下記の通りです。 kato198636 kato1986 kato36 kato kato19860306 kato0306 以降megumiとmeguchan等々 そしてできれば上記の結果にプラスして下記の結果が出力されればありがたいのですが(名前と生年月日が逆になります)。 198636kato 1986kato 36kato kato 19860306kato 0306kato ■なので期待している結果は下記の通りです。 kato198636 kato1986 kato36 kato kato19860306 kato0306 198636kato 1986kato 36kato kato 19860306kato 0306kato 以降megumiとmeguchan等々 私の説明不足で大変申し訳ありません。 何卒よろしくお願いいたします。 めぐみ
- ORUKA1951
- ベストアンサー率45% (5062/11036)
Linux使いなら、SED(ストリームエディタ)( http://ja.wikipedia.org/wiki/Sed_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF) )でしようが、これだけの処理だと、ちょっとややこしいので、・・私には、このSEDのコマンドは書けない。 AWK( http://ja.wikipedia.org/wiki/AWK )-- jgawk( http://oscar.gsid.nagoya-u.ac.jp/tech/text/howtoawk.html ) なり、Perl( http://ja.wikipedia.org/wiki/Perl )なり、Ruby( http://ja.wikipedia.org/wiki/Ruby )なり、Python( http://ja.wikipedia.org/wiki/Python )を使うことになりますかね。 それぞれの言語のマニュアルをお読みください。ここで説明しきれる内容ではありません。PerlかRubyは、今後のためには身につけておくと良いでしょう。 各行を配列に読み込んで、文字列連結(perl.)(AWK [半角スペース])(Ruby+)でつなげてprint(printf)する。 いずれもLinux版があります。sedとPerlは最初から入っているでしょう。AWKはあるでしょうが、jgawkは???。
お礼
tatsu99さま 本当に本当にありがとうございました! すぐに対応して頂いてなんと感謝して良いか分かりません。 本当にすばらしいと思います。 tatsu99さまのアドバイスに本当に感謝したいです。 今後とも何かありましたらぜひよろしくお願いいたします。 後ほどベストアンサーの登録をさせて頂きますね。 本当に本当にありがとうございました。 めぐみ