• ベストアンサー
  • 困ってます

UNIXでのプログラム

UNIXでのシャルスクリプトでもAWKでもいいのですが以下のようなことがやりたいのですが、いい方法が思い つきません。どなたか教えて下さい。 テキストファイルがあり、そのファイル中の”//”という文字から行末までは削除したファイルを作りたい。 ”//”という文字列は文字列の途中にあるケースも前後にスペースが存在して単語として存在しているケースもあります。

共感・応援の気持ちを伝えよう!

  • 回答数6
  • 閲覧数180
  • ありがとう数1

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

  • ベストアンサー
  • 回答No.5
  • terra5
  • ベストアンサー率34% (574/1662)

sed -e /^\\/\\//d -e "s/\\/\\/.*$//" foo.cpp /^\/\//d  行の先頭が//の行を削除 s/\/\/.*$// //から行末までを削除(何も無しに置換) シェルのコマンドラインにいれる場合は\を\\にする必要がありますから、最初の行の通りになります。 更に空白行を削除したければ /^[ \t].*$/d 空白とタブだけからなる行か空の行を削除 行頭が空白類の場合の//も削除したいなら /^[ \t].*\/\//d 等を-eと共に追加して下さい。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • UNIXで、とあるテキストに対して2文字区切りで改行をいれるには?

    UNIXのシェルスクリプトで、このような動作ができないものかどうか考えています。 あるテキストファイルの内容を、2文字ごとに区切って改行を入れるように加工する 例えば file1.txt が以下のような内容であれば --file1.txt-- 000092 027301 01 0263000001 2文字ずつ区切って改行を挿入したファイル --file2.txt-- 00 00 92 02 73 01 01 02 63 00 00 01 を生成したいと思います。 ここで元のファイルは必ず、半角の数字のみで構成されており、 1行の文字数は最低2文字以上あり、なおかつ奇数個の文字列は存在しないものとします。 awk や grep や sed を組みあわせて考えているのですが、 なかなか解決に至りません。 どなたかお知恵を拝借願います。

  • テキストファイル内の(から)の取り出し

    テキストファイルの中の”(”から”)”までの中身をとりだしたい のですが言い方法が思いつきません。どのようにすればいいでしょうか? OSはSolarisまたはLinuxです。 ”(”の中は”(”が何重かネストしています。 手段は特に問わないのですが、今後のメンテを考慮すると awkかperlのスクリプトで実現できればありがたいでです。 イメージとしては ファイルAの中 文字列1( (・・) (・・) ) 文字列2( (・・) (・・) ) をA.文字列1、A.文字列2で出力できればと思います。

  • unixのperlで

    UNIXのPerlでは引数は@ARGVに入ると思うのですが、 a.pl *.c "*.c" という引数を入れるとファイルが展開されそのフォルダの中の "12-1.c" とか "12-2.c" とかいう引数が、配列に1つずつ入ってきました。 引数の文字列を何の修正もなしに(できればスペースも)受け取る方法はないですか?

    • ベストアンサー
    • Perl

その他の回答 (5)

  • 回答No.6

こんにちは。 皆さんのお答えはそれでいいと思います。補足をお読みして思ったのですが、 >実際に実行させようとすると > >/^: Event not found > >なるエラーではしりません。 もしかしてお使いのシェルがCシェル系(csh, tcsh)なのではありませんか? コマンドにCシェルのイベント指定子(!)が含まれる時の典型的症状に見えたので。 複雑な sed, awk コマンド、特に「!」やシングル、ダブルクォーテーションが 交錯するものをワンライナー(コマンドラインから1行)で書くときは、 Bシェル系シェル(sh, bash など)の上で走らせる方が無難です。 以上ただの補足です、失礼しました。

共感・感謝の気持ちを伝えよう!

  • 回答No.4
  • 3rd
  • ベストアンサー率30% (7/23)

No.2 です。 補足を読みましたので再登場。 // で始まる行は、出力させないとのことですので、 No.1 さんのを拡張して、 awk -F// '!/^\/\// {print $1}' <filename> でどうでしょう? // の前に、半角スペースのみがある場合も、となると、 awk -F// '!/^ +\/\// {print $1}' <filename> でいいかも。

共感・感謝の気持ちを伝えよう!

質問者からの補足

何度も何度もお手数かけてスイマセン。 私としても awk -F// ’!/^ +\/\// {print $1}’<filename> で完璧かと思ったのですが、 実際に実行させようとすると /^: Event not found なるエラーではしりません。コマンドとしては問題ないように思うのですが...

  • 回答No.3
  • kaha
  • ベストアンサー率23% (41/177)

わたしも一言。補足を読む限り、No.1 さんの答えで OK だと思います。 //のある行、//のない行もとちらも出力していますよ。(No1さんの「回答に対する補足」のとおりに。)

共感・感謝の気持ちを伝えよう!

  • 回答No.2
  • 3rd
  • ベストアンサー率30% (7/23)

補足を読む限り、No.1 さんの答えで OK だと思います。 というか完璧。 どこか実行結果に気に入らないところがあったのでしょうか? その場合は、さらに具体的に補足していただけると いいかと思います。

共感・感謝の気持ちを伝えよう!

質問者からの補足

すいません。私が少し勘違いをしていました。 確かに、”ma_asami”さんの回答でほぼ完璧でした。 ここでほぼと言ったのはこのやり方で、問題があるといるわけではないのですが、”//”ではじまる行は空白行が 出力されて今ためしているファイルでは空白行が大量に出力されていたので、私は”//”のない行でうまくいっていないのだと勘違いしていました。できれば、”//"ではじまる行は何も出力しないでそれ以外は今回の回答と同等の動きをしてくれればありがたいのですが.. とえりあえずは勘違い申し訳ありません。 更なるご協力をいただけると助かります。

  • 回答No.1

すみません、「”//”という文字列は文字列の途中にあるケースも前後にスペースが存在して単語として存在しているケースもあります」という部分がよく分からないのですが、単純に awk -F// '{print $1}' <filename> ではダメでしょうか??

共感・感謝の気持ちを伝えよう!

質問者からの補足

説明不足の点がありました。テキストファイルの各行の中に必ず”//"という文字列があるというわけではないのです。”//”を全く含まない行も多数存在しています。 そして、そういった行はそのまま出力したいのです。 ”//”が文字列の途中にあるケースと前後にスペースがあるケースとは例えば 1行目は”//"なし 2行目は文字列中に"//" 3行目は”//”の前後にスペース という場合の例だと  1行  zzz = uuu or ppp   2行 000///aaa = bbb   3行 ccc= ddd and eee // coment      ↓     zzz = uuu or ppp      000     ccc = ddd and eee としたいということです。 もし、両方同時というのが困難であればとりあえず、スペースがあるケースでもいのですが..

関連するQ&A

  • UNIXで数字の文字列を、数値に変換するには?

    UNIXで、数字のみの文字列を、その文字列で表される数値に変換して変数に代入したいのですが、どうすればいいでしょうか? つまり、 VALUE=`echo 22j4444j33 | awk -F'j' '{print $1}'` <VALUEに入った"22"を22の数値に変換> exit $VALUE というようなことがしたいです。 よろしくお願いします。

  • awkで改行を除いて文字列を抜きだす

    こんにちは。 UNIXユーザーです。 awkでテキストファイルから行、列を指定して、文字列を抜き出し、それをシェルで変数として定義したいのですが、各行の最終列(最も右の列です)を指定すると、抜き出した文字列の末尾に’^M’がついてしまいます。 これが改行を意味するということは分かったのですが、これを取り除くためにはどうしたらよいでしょうか?? どなた様かご教授ください。 よろしくお願いいたします。

  • UNIX シェルスクリプト

    UNIXのシェルスクリプトを使用してテキストファイルのある列にある 特定の文字列を条件としてその行を出力するということをやりたいのですが どのようにすればできるでしょうか? 例えば,以下のようなテキストファイルがあって,2列目がYAHOOの行を 主力したいというようなことです。 AAA SOFTBANK BBB YAHOO YAHOO TEST CCC QUICK DDD YAHOO ↓ BBB YAHOO DDD YAHOO

  • 文字を自動で書き込むツール

    テキストファイルの中の全ての行末に自分が指定した文字列を書き込むツールってないでしょうか?

  • UNIXのコマンドを教えて下さい。

    AAAAという名前のテキストファイルにBBBBという文字列が含まれる行の最後に CCCCの文字列を追加したい場合、どのようなコマンドを使ったらよいでしょうか?

  • UNIX ファイル存在チェックの方法

    お世話になります。 UNIXにてファイル存在チェックを行うShellスクリプトを作成しています。 ■プログラム if (-f "text_file_*.txt") then echo "存在している" else echo "存在していない" endif ■問題点 IF文中の比較対照ファイルとして、ワイルドカード(*)を 指定しているのですが、文字列として認識されてしまいます。 この方法でワイルドカードとして処理を実行する方法はあるでしょうか? もしくは代替案などありましたら、ご教示いただきたいです。 よろしくお願いします。

  • unix awkコマンド 複数区切り

    カンマ2つ(,,)+文字の抽出方法がわかりません・・・。 例: ファイル内(下記2行)に対して 12,34,,567@89 1,2,34,,567@89 1行目2行目ともに「567」が表示したいです。 # ”カンマ2つを一つの文字列”だけだと「awk -F",,"」でいけますが、+文字列がどうやってもできません。。

  • UNIX:縦一列のファイルを横一行として表示したい

    お世話になります。 A.TXTのような縦一列にデータが入っているテキストファイルがあります。 それを横一行の形式で表示させたいのですが、可能でしょうか? 実現する方向性のヒントでも頂けたらと思います。 ■望む結果 文字列1文字列6文字列5文字列2文字列4文字列3 ------------------------------------------ catコマンドでファイルを見ると、A.TXTの内容のままになります (まぁ、当たり前ですが・・・)。 ■A.TXT 文字列1 文字列6 文字列5 文字列2 文字列4 文字列3 ※文字列の並びはランダム

  • ファイルからデータを読み込み平均値を求めるプログラムについて

    ファイルからデータを読み込み平均値を求めるプログラムについて はじめまして、最近C言語を学習し始めたものです。 ファイルからのデータ読み込みについての質問です。 たとえば、テキストファイルとして以下のような名前とスコアが示してあるファイルがあります。 ************************* 佐藤 0.8 伊藤 0.9 西村 0 酒井 -2.5 佐藤 -0.1 ・・・  ・・・ ・・・  ・・・ 西村 0.3 ************************* (名前の繰り返しもあるファイルです) このようなファイルから読み込みを行って、 左の氏名ごとにスコアの平均値を求めるプログラムを作成したいと考えております。 実行例として「西村」の場合0と0.3の平均値である0.15を求めて表示させたいです。 ・プログラムの流れとして         テキストファイルを読み込む     ↓ (テキストファイルの最後になるまで、各文字列(氏名)ごとのスコアの平均値を求める) ◇文字列(氏名)=初めて出た文字列   ←(条件分岐) yes→文字列の出た回数=文字列の出た回数+1     文字列.スコア=スコア no→文字列の出た回数=文字列の出た回数+1    文字列.スコア=(文字列.スコア+スコア)/文字列の出た回数 終了すると結果をファイルに書き込む このような流れでプログラムを作りたいと考えているのですが、 特に条件分岐のところをどのようにプログラムで表現したらでしょうか? 回答よろしくお願いします。

  • ファイルからある文字列の個数を数えたい

    perl5でunixの"wc"や"grep -c"みたいに1つのファイルの中からある文字列の個数を カウントするスクリプトを作ろうとしています。 ファイルは256文字×10万行くらいのテキストで、 検索する文字列は15文字前後×40個(例えば「apple-000001」「lemon_orange」など)です。 どのようなスクリプトを組んだら効率よく各文字列をカウントできるのでしょうか? それよりwcやgrep -cを40回行った方が早いのでしょうか?

    • ベストアンサー
    • Perl