• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:テキストを処理するプログラム)

テキストを処理するプログラム

このQ&Aのポイント
  • Linuxでテキストを処理する方法について教えてください。
  • A.txtとB.txtの値を組み合わせて出力する方法を教えてください。
  • プログラムの初心者ですが、テキストの処理方法について教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.8

#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); } --------------------------------------------

megumi19910715
質問者

お礼

tatsu99さま 本当に本当にありがとうございました! すぐに対応して頂いてなんと感謝して良いか分かりません。 本当にすばらしいと思います。 tatsu99さまのアドバイスに本当に感謝したいです。 今後とも何かありましたらぜひよろしくお願いいたします。 後ほどベストアンサーの登録をさせて頂きますね。 本当に本当にありがとうございました。 めぐみ

その他の回答 (6)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.7

#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]); } -------------------------------------------------------------------- これで同じ結果が得られます。

回答No.6

にぎやかしで。 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)
回答No.5

#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)
回答No.3

B.txtの利用方法が不規則に見えます。どういう風に使うのか、日本語できちんと書けますか?

megumi19910715
質問者

お礼

返信ありがとうございます!めぐみです。 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)
回答No.2

#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

megumi19910715
質問者

お礼

早速の返信ありがとうございます!めぐみです。 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)
回答No.1

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は???。

関連するQ&A