- ベストアンサー
(UNIX)後ろのスペース出力について
UNIXのコマンドで、catで読み込んだ行をwhile文でファイルに出力しているのですが、その際に後ろのスペースを消さずに出力するにはどうすれば良いのでしょうか? 以下のような処理を行っています。 cat $infile | read LINE do echo "$LINE" >> $outfile done <$infileの内容> 1 10 100□□□□□□ 2 20 200□□□□□□ ・・・ 以上となります。よろしくお願いします。
- stickright
- お礼率30% (32/106)
- その他([技術者向] コンピューター)
- 回答数5
- ありがとう数3
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
空白が無視されるのはシェルの入力区切りに空白が含まれるためなので、 区切りを改行のみにすれば目的が達成されます。 $ IFS="\n"; while read line; do echo "${line}" >>out; done <in でどうでしょうか。Ubuntuのdash(/bin/shの実体)ではうまくいきました。 $ od -a in 0000000 1 sp sp nl 2 sp sp nl 3 sp sp nl 0000014 $ od -a out 0000000 1 sp sp nl 2 sp sp nl 3 sp sp nl 0000014
その他の回答 (4)
- Tacosan
- ベストアンサー率23% (3656/15482)
激しく同意>#3. わざわざ茨の道を選ぶこともないと思う. まあ, 「シェルで」って制限を付けられたときに (「sed なども使わずシェルの機能のみで」と曲解して) 無理矢理 while read することはあるけど, それ以外では基本的にやる気になれないなぁ.
- kmee
- ベストアンサー率55% (1857/3366)
なんで while + read でやろうとする人が多いのかなぁ。 どんな処理するか知りませんが、 sed '処理' < $infile > $outfile awk '処理' < $infile > $outfile perl -npe '処理' < $infile > $outfile 等、簡単で早くて効率いい方法がいくらでもあるんですが
- gamera4500
- ベストアンサー率62% (44/70)
こんちは うろ覚えで申し訳けないのですが、これは cat $infile > $outfile で同じことができると思います。 スペースも削除されないと思います。 でも、これは只たんにコピーしているだけなので普通は cp $infile $outfile が普通使うコマンドです ちなみに、どんどんOUTFILEに追記(下につなげる)のは cat $infile >> $outfile です。
お礼
回答ありがとうございます。 前のご解答にもありましたが、一行ずつループで読み込んで加工しながら出力したい為この様なコマンドになっています。 この様なやり方で後ろのスペースを消す方法がございましたら教えてください。お願いします。
- jjon-com
- ベストアンサー率61% (1599/2592)
cat $infile >> $outfile とせず,あえてループを構成しているのは,本質問では省略されている何らかの文字列加工をおこないたいからでしょうか?
お礼
回答ありがとうございます。 ご指摘の通り、文字列加工を行いたくてループにしています。この方法では後ろのスペースは残せないのでしょうか?
関連するQ&A
- シェルスクリプト
2月14日頃質問のあった”UNIXのシェルスクリプトを使用してテキストファイルのある列にある特定の文字列を条件としてその行を出力するということをやりたい”を下記のように作ってみました。問題ないか逆質問の形で投稿します。(ルール違反かもしれませんが質問が締め切られているので・・・) #!/bin/bash CAT=YAHOO while read LINE do echo $LINE > tmp.txt DOG=`cut -d" " -f2 tmp.txt` if [ "$CAT" = "$DOG" ] then echo "$LINE" fi done < catalog.file
- ベストアンサー
- その他([技術者向] コンピューター)
- unixのシェルでファイル内容を読み込む
ど初心者です。わかりづらいかもしれませんが宜しくお願いします。 以下のような処理を行いたいと考えています。 (1) aaa.sh(シェルスクリプト)にてバッチプログラムを起動 (2)バッチでエラーの場合、結果ファイル(bbb.txt)に「1」を出力する。 (3)aaa.sh(シェルスクリプト)にて結果ファイルの内容を読み取り「1」の場合は、再度バッチプログラムを起動する。 このうち(3)の処理にて、結果ファイルの読み込み方法がわかりません。 調べた結果、以下のような処理で可能なようですが・・ while read LINE; do echo $line done < aaa.txt 読み込むのは1行なので、ループ処理にはしたくないのですが、例えば「read LINE aaa.txt」のような簡単なコマンドで、ファイルの中身を読み込むことはできないのでしょうか? 実はUNIXが初めてで、しかもスケジュールに余裕がないため焦っております。 なにぶん知識不足な故、ちんぷんかんぷんな質問かも知れませんが、よろしくお願いいたします。
- ベストアンサー
- その他(プログラミング・開発)
- シェルスクリプトでファイルの読みとり
/etc/ldap.confからpam_passwordで始まる行を見つけてその行を書き換えて上書きする関数を作ろうとしているところです。 以下のようにしましたがデバッグのためのechoでの出力が見えませんでした。 echoで1行ずつ列挙されるのを確認したいのですがどうしたらよいですか? function func1 { while read LINE ; do echo $LINE done < $1 return "" } buf=`func /etc/ldap.conf`
- 締切済み
- Linux系OS
- duコマンド+アルファで大きなファイルを検索
以下のコマンドでディスク内の大きなファイルを検索することはできるのですが、ディレクトリも検索されてしまう為、ファイルかどうか判断するのは自分で見なければなりません。 --------------------------------------------------------------- du -a `ls -la /| egrep -wv "backup|^l[rwx-]+|skel|\.|\.\.|^total|proc" | awk '{print $NF}'` | sort -nr | head -30 出力された内容がディレクトリなら偽として、大きなファイルだけをしりたいのです。 一度ファイルに出力してからwhileを使って一行ずつifコマンドでディレクトリなら偽として出力していけばできるのですが。 ------------------------------------------------------------------ while read line ;do if [ -f "$line" ] ; then echo "$line" ; fi ; done < list これと同じ結果をファイルを作成せずにやりたいのです。 while分の最後のdoneにファイルをリダイレクトさせる要領で while read line ;do if [ -f "$line" ] ; then echo "$line" ; fi ; done < `printf "$list\n"` としてもうまくゆきません。 どうしたらファイルを作成せずにディスク内の大きなファイルだけを検索する事ができますでしょうか。
- ベストアンサー
- Linux系OS
- テキストファイル内の半角スペースの削除
よろしくお願いします。 OS:Windows Server 2003,Windows 2000 Server MS-DOSコマンドによるバッチで、あるテキストファイル(.txt)内 を検索し、半角スペースがあった場合は半角スペースを 削除するというものを検討中です。 あるテキストファイルには、「Dir /s /a <ディレクトリパス>」(★) の結果が出力されています。 ※http://okwave.jp/qa2630050.htmlの「その他問題点」の 回避手段を考えています。 http://www.fpcu.jp/dosvcmd/bbs/log/cat3/cat54/4-0515.htmlを 参考にし下記のようにバッチを組みましたが、★の結果から 半角スペースを削除した内容になりません。 ------- set infile=%1 set outfile=%2 for /f "delims=" %%A in (%infile%) do call :sub "%%A" goto :eof :sub set STR=%~1 set STR=%STR: =% echo.%STR%>>%outfile% ------- 何がまずいのでしょうか? <DIR>という文字列を含んでおり、"<" や ">" を考慮する 必要がある気はしていますが、どのように修正すればよいか、 なかなかうまくいきません。 修正点やアドバイスをいただけると幸いです。
- 締切済み
- その他(プログラミング・開発)
- 【シェル】whileコマンドについて
【シェル】whileコマンドについて OS:Solaris10 SH:Bシェル お世話になります。 whileコマンドにてテキストから、先頭に"#"(シャープ)が付いている行と、 空白行以外を読み込ませたいです。 ところが、メイン処理にawkコマンドを入れると、テキストを読む時点で、 行全体ではなく、指定したフィールド内の文字列を読みにいくため、 "#"(シャープ)が付いている行を無視することができません。 ====== while.sh ====== #!/bin/sh while read LINE do echo $LINE | awk '{print $2}' done < list.txt | grep -v "^#" | grep -v "^$" ====================== ------ list.txt ------ 1 2 3 #4 5 6 7 8 9 ---------------------- ****** 出力結果 ****** 2 5 8 ********************** ** 出力させたい結果 ** 2 8 ********************** whileコマンドのオプション等で、テキスト内に特定の記号がある行は 無視して読み込ませる方法がありましたら、ご教授ください。 宜しくお願い致します。
- ベストアンサー
- その他(プログラミング・開発)
- シェルスクリプトでwhileを用いてrshを繰り返し使う場合
Bシェルスクリプトでリモートシェル(rsh)を使う場合の質問です。 現在、以下のような状態です。 有識者の方、アドバイスをお願いします。 ・Aでは、ループされずhostAの場合のみ処理がされます。 (while文が効いていない) ・Bでは、ループされて問題なくhostA,hostB,hostCが処理されます。 (while文が効いている) なぜなのでしょうか。。。(r系コマンドの特性?) ちなみり、リモート側のサーバには.rhostsが設定してあり 問題なくコマンドが通ることは確認済みです。 スクリプトA---------------------------------------------- #!/bin/sh while read line ; do rsh $line hostname done <<END hostA hostB hostC END スクリプトA---------------------------------------------- スクリプトB---------------------------------------------- #!/bin/sh while read line ; do echo " HOST=$line" done <<END hostA hostB hostC END スクリプトB----------------------------------------------
- ベストアンサー
- その他(プログラミング・開発)
- シェルスクリプト shiftとwhile
下記の内容はスクリプトの一部を抜粋した内容です。 2箇所、理解が出来ない部分があるので、教えて頂けますでしょうか。 ------------------------------------------------ shift $(( $OPTIND -1)) if [ $# -eq 0 ]; then FileName="" elif [ $# -eq 1 ]; then if [ "\-" = "$1" ]; then FileName="" else FileName="$1" fi else echo "オプションが多い" exit fi if [ "" = "$FileName" ]; then while read line; do fcnctionA "$line" done else while read line; do fcnctionA "$line" done < "$FileName" fi ------------------------------------------------ (1) if [ "\-" = "$1" ]; then 部分が理解できないのですが、教えて頂けますでしょうか。 (2) if [ "" = "$FileName" ]; then while read line; do fcnctionA "$line" done 基本はファイル名を指定して実行する事を前提としていると思います。 ファイル名を指定しないでスクリプトの実行をする場合は、1行ずつ標準入力で 入力すると思うのですが、このような使い方をする場合はあるのでしょうか。 下記よりも便利な点があるようでしたら、教えて頂けますでしょうか。 または、shiftと関係があるのでしょうか? if [ ! "" = "$FileName" ]; then while read line; do fcnctionA "$line" done < "$FileName" fi
- ベストアンサー
- その他(インターネット・Webサービス)
- 【シェル】ループの中で対話処理をしたい
unix上でシェルを書いています。 ループ内で対話形式で処理をしたいのですが、入力待ちとならないままループしてしまいます。 ループの中で、キーボードからの入力があるまで処理を待たせることは可能でしょうか。 test.txtの内容*** 花子 太郎 二郎 三郎 *************** このテキストを読み込んで年齢を入力してもらうという処理です。 読んだ後の処理はここでは省略します。 while read line; do echo $line "この人の年齢を入力して下さい。" read ymd if [ "$ymd" = "" ]; then echo "未入力です!" exit 0 fi done < test.txt これを実行すると、入力をまたずに未入力、未入力、未入力…と標準出力されます。 1行読んだら、年齢を聞いて、入力があるまでは"read ymd"の処理を行わない、という ようにする方法をどうかご教授願います。
- ベストアンサー
- その他(プログラミング・開発)
- 全角空白が間に挟まれているキーワードで検索
どこかに書いてあったことを参考にしたのですが、 $ find /tmp -type f > find.txt ; cat find.txt | while read LINE ; do echo grep -l \"This\\s*program\" \"$LINE\" >> grep_script.sh ; done によりできあがったスクリプト grep_script.sh を走らせることで、その中の一行一行で grep -l "This\s*program" /tmp/sample.txt こういう感じのコマンドが実行され、 半角空白が間に挟まれている「This program」を検索できますが、 全角空白が間に挟まれている「This program」を検索するにはどうすればいいでしょうか? 全角スペースの文字コード 0x81,0x40 を使えばいいのかな、とは思ったのですがやり方が分かりません。 どのようにすればいいでしょうか? よろしくお願いします。
- ベストアンサー
- Linux系OS
お礼
回答ありがとうございます。 試したところ、うまく行きました。ありがとうございます。