トップページunix
987コメント345KB

シェルスクリプト総合 その13

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2008/10/16(木) 00:48:38
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。


□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashなので特に注意。
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)

□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。

前スレ
シェルスクリプト総合 その12
http://pc11.2ch.net/test/read.cgi/unix/1218277263/
0619名無しさん@お腹いっぱい。2009/01/10(土) 15:11:30
>>618
そんなコマンドは見たことないな。

置き換え対象のファイルがあまり大きくないならperlかなにかで
一つの文字列にまるごと読み込んで置換するのが楽だと思う。
メモリにおけないぐらいでかいファイルなら工夫が必要だけど
0620名無しさん@お腹いっぱい。2009/01/10(土) 21:49:06
>>551
今一何をしたいのかよく分からないんだけど、
a.datとb.datを評価して違っていればc.datに置き換えると解釈して書いてみた。

#!/bin/sh
File_line_digit(){
FLINE=`cat "$1" | wc -l | sed 's/[[:blank:]]*//'`
echo "$FLINE"
}
Use_line_strings(){
STRINGS=`head -n "$1" "$2" | tail -n 1`
echo "$STRINGS"
}
続く




0621名無しさん@お腹いっぱい。2009/01/10(土) 21:49:26
ONENUM=1
TWONUM=1
THREENUM=1
ONEEND=`File_line_digit "$1"`
TWEEND=`File_line_digit "$2"`
THREEEND=`File_line_digit "$3"`
while [ "$ONENUM" -ne `expr "$ONEEND" + 1` ]
do
ONESTR=`Use_line_strings "$ONENUM" "$1"`
TWOSTR=`Use_line_strings "$TWONUM" "$2"`
THREESTR=`Use_line_strings "$THREENUM" "$3"`
if [ "$ONESTR" = "$TWOSTR" ]
then
echo "$THREESTR"
ONENUM=`expr "$ONENUM" + 1`
TWONUM=`expr "$TWONUM" + 1`
THREENUM=`expr "$THREENUM" + 1`
else
echo "$ONESTR"
ONENUM=`expr "$ONENUM" + 1`
fi
done
0622名無しさん@お腹いっぱい。2009/01/11(日) 01:00:39
問題の解釈間違ってると思うけど
それ以前にブログラミングのセンスなさすぎだろ

関数名も変数名も処理内容もださすぎ
0623名無しさん@お腹いっぱい。2009/01/11(日) 01:39:26
ネタで書いてるものだと思ってたが、もしかして違うのか?
0624名無しさん@お腹いっぱい。2009/01/11(日) 03:29:31
たまにいるなこうゆう人。 プログラム書かないでほしいよ、、今の上司とか
0625名無しさん@お腹いっぱい。2009/01/11(日) 09:06:20
>>620
とりあえず、頭の関数ひとつだけ添削してやるよw

File_line_digit(){
FLINE=`wc -l < "$1"`
echo $FLINE # ここは、わざとダブルクォートを付けない
}

↑のようにすれば、wc -l の出力のスペースをカットするために
わざわざsedを使う必要がない。あと、もちろんcatは不要。
wc -l の出力にファイル名が付かないように、
標準入力からリダイレクトする。
0626名無しさん@お腹いっぱい。2009/01/11(日) 11:42:35
>>622>>623>>624
自分で見直しても読みにくいの書いてすいません(藁
出直してきます。
>>625
目から鱗です。
06275712009/01/12(月) 13:28:52
なるほど!。さんくすですm(_ _)m
0628名無しさん@お腹いっぱい。2009/01/12(月) 14:18:39
俺も>>551に挑戦してみたんだが、
何故か思うように動かない。
考え方としては有っていると思うのだが、
最後のif文の比較がどうしても真にならない。

set -x して、トレースしたら同じ文字列のはずだし、
空白が混入しているようにも思えないのだが・・
06296282009/01/12(月) 14:22:44
#!/bin/sh -
searchLine=`head -n 1 "$2"`
fullLines=`echo \`wc -l < "$1"\` `
matchLines=`echo \`wc -l < "$2"\` `
matchPat=`tr '\012' ' ' < "$2"`

while [ $fullLines -ge $matchLines ]
do
 cmpPat=`tail -n $fullLines "$1" | \
  awk '
   $0 !~ /^'"$searchLine"'$/ {
    print > "/dev/tty"
   }
   /'"$searchLine"'/{
    cmpPat = $0
     for ( i = 1 ; i < '"$matchLines"' ; ++i ) {
       getline addLine
       cmpPat = cmpPat " " addLine
   }
print cmpPat
nextfile
 }'`
 if [ "$cmpPat" = "$matchPat" ]
  then
   cat "$3"
   $fullLines=`expr $fullLines - $matchLines`
  else
   fullLines=`expr $fullLines - 1`
  fi
done
tail -n $fullLines "$1"
06306282009/01/12(月) 14:37:35
ああ、余計な $ が、一個付いてるけど、
そもそも、そこに処理が行かないわけで・・
06316282009/01/12(月) 14:57:09
お騒がせしました。
trが最後に改行が無くても空白を追加していました。

しかし、どうも上記はまだまだ使い物になりません。
もう少し精進します。

てか、これ、結構ムズい。
06326282009/01/12(月) 15:29:55
連投申し訳ない。動いたかも??
#!/bin/sh -
searchLine=`head -n 1 "$2"`
fullLines=`echo \`wc -l < "$1"\` `
matchLines=`echo \`wc -l < "$2"\` `
matchPat=`tr '\012' ' ' < "$2"`
while [ $fullLines -ge $matchLines ] ; do
cmpPat=`tail -n $fullLines "$1" | \
awk '
$0 !~ /^'"$searchLine"'$/ {
print > "/dev/tty"
nextfile
}
$0 ~ /^'"$searchLine"'$/{
cmpPat = $0
for ( i = 1 ; i < '"$matchLines"' ; ++i ) {
getline addLine
cmpPat = cmpPat " " addLine
}
cmpPat = cmpPat " "
print cmpPat
nextfile
}'`
if [ "$cmpPat" = "$matchPat" ]
then
cat "$3"
fullLines=`expr $fullLines - $matchLines`
fi
fullLines=`expr $fullLines - 1`
done
tail -n $fullLines "$1"
0633名無しさん@お腹いっぱい。2009/01/12(月) 18:48:11
そんなの誰も見ないから、ちらしの裏に書いとけ
0634名無しさん@お腹いっぱい。2009/01/12(月) 22:40:43
>>633

そうは言うけど、>>551の設問を
>>557の要件で満たすのは大変だぞ。

現に誰もまともな解答例が無いだろう。

仮に三つのファイルを
1・対象ファイル
2・参照ファイル
3・置換ファイル

として、1の行数が不定の上、
2が何回マッチするかも不定で、
シェルスクリプト流に一行づつ処理するならば
途中でマッチしないことが判明したら、仕切り直さないといけない。
(でも、マッチしたらその分行を進めないといけない)

いっそC言語とかで書いて、2のファイルを読み出して保持しておき、
同じサイズのバッファをmallocとかで確保し、順次改行迄ごとに1のファイルを読んで、
strcmpとかする方が楽に思える。

無駄な処理が実に多いのは承知の上で、
tail と awk の合わせ技で料理したのに、
実に君は無礼だな。
0635名無しさん@お腹いっぱい。2009/01/13(火) 02:34:49
複数行の置換をawkで考えたくないなあ
富豪的にrubyとかperlでやった方がマシでしょ

#!/usr/bin/env ruby
# -*- coding: utf-8; -*-
abort unless ARGV.size == 3
open(ARGV.shift).read.\
gsub(/#{Regexp.escape(open(ARGV.shift).read)}/m,open(ARGV.shift).read).\
display

まあワンライナーだよな
0636名無しさん@お腹いっぱい。2009/01/13(火) 07:55:53
>>551

cat a.dat b.dat c.dat | uniq

おまいら大丈夫か?
0637名無しさん@お腹いっぱい。2009/01/13(火) 07:57:11
>>635

>まあワンライナーだよな

ぷぷぷ
0638名無しさん@お腹いっぱい。2009/01/13(火) 08:00:14
>>636
>>557 を欲詠め
あなたの回答は全くの見当違い
0639名無しさん@お腹いっぱい。2009/01/13(火) 12:20:07
>>635
多大なるヒントを有難う。
やっぱりawkだけで書けるわ。

#!/bin/sh -

searchLine=`head -n 1 "$2"`
matchLines=`echo \`wc -l < "$2"\` `
cmpList=`tr '\012' ' ' < "$2"`

awk '
$0 !~ /^'"$searchLine"'$/ {
print $0
next
}
$0 ~ /^'"$searchLine"'$/ {
matchList = $0
for ( i = 1; i < '"$matchLines"'; ++i ) {
getline
matchList = matchList " " $0
}
matchList = matchList " "
if ( matchList ~ /^'"$cmpList"'$/ ) system("cat '"$3"'")
else {
sizeOfArray = split(matchList, pArray, " ")
for ( i = 1; i <= sizeOfArray; ++i)
print pArray[i]
}
}' "$1"
0640名無しさん@お腹いっぱい。2009/01/13(火) 12:26:52
>>639
BEGINで$1, $2のファイル読み込むといいと思うよ。
awkは(初期のを除いて)リダイレクト使えるから。
# すれ違いっぽいからコードは書かないけど
0641名無しさん@お腹いっぱい。2009/01/13(火) 15:30:14
>>640
有難う御座います。

awkでの正規表現中での変数展開のやり方が分からず、
先にシェルに展開してもらう方法をとっていましたが、
今調べたり、それを元にゴソゴソやって。

$0 ~ "^"var"$" { とか
if ( var1 ~ "^"var2"$" ) で、

どうやら完全一致を取り出せそうなことが分かりました。
0642名無しさん@お腹いっぱい。2009/01/13(火) 16:42:25
右辺は正規表現パターン。
右辺が文字列型の値の場合は正規表現パターンを表すとみなす。
だからawk -v arg1="XXX"{ BEGIN { searchLine=arg1 } $1 ~ searchLine { ...って出来る。
awk本のオリジナルawkは、"-v"なしで代入式だけを書かないといけないんだけど。
"-v"はnawk移行かな? 今はほとんど全部"-v"が必要なはずと思う。
0643名無しさん@お腹いっぱい。2009/01/13(火) 16:43:35
searchLine="^" arg1 "$"
と書いたつもりでした。
0644名無しさん@お腹いっぱい。2009/01/13(火) 21:12:10
なんで上記コードでは、awkスクリプト全体の「'」と
正規表現中の「'」がうまく認識されるのですか?

awk '
$0 !~ /^'

ここでぶったぎられそうな気がするのですが。
0645名無しさん@お腹いっぱい。2009/01/13(火) 21:23:35
>>644
ぶったぎられる、というのはその通り。
ところが、その直後にスペースを入れずに "$searchLine" と続けているから、
結局これら全体がシェル上で「1つの引数」になって awkに渡される。
0646名無しさん@お腹いっぱい。2009/01/13(火) 22:38:22
>>644

単にシェルが「'」を食べるだけ。

#!/usr/bin/awk -f というスクリプトを考えたら良い。
そう言う場合は「'」は不要でしょう?。

要するに、「'」と「'」に挟まれたところをシェルがそのまま awk に渡し、
その外側の部分を、シェルが先に解釈(展開)すると言うだけの事。
最終的には全部 awk に渡される。
0647名無しさん@お腹いっぱい。2009/01/13(火) 22:44:06
>>646
違うよ。

>>645
が正解。
0648名無しさん@お腹いっぱい。2009/01/13(火) 23:13:01
>>644
$set 'Path'" $HOME "' is my home.'
$ echo $1
Path /home/foo is my home.
##
$ set 'Path' "$HOME" ' is my home.'
$ echo $1
Path
$ echo $2
/home/foo
$ echo $3
is my home.

こういうことだけど。
文字列の間に空白がないから一つになってる。
0649名無しさん@お腹いっぱい。2009/01/13(火) 23:14:10
>>647

むむ。
>>645 は、何も言っていないに等しいとしか読めない。
スペースの有る無しは変数名が変わると言うことだし、
awk への引数ではなく、その文脈上の展開した値として単純に awk に渡されると
認識している。

念を押すが、awk (にしろ他のコマンドにしろ)「'」の存在は知らない。
0650名無しさん@お腹いっぱい。2009/01/13(火) 23:17:03
いや、正直良く分かりません。

??
0651名無しさん@お腹いっぱい。2009/01/13(火) 23:28:32
>>648
なるほど。ありがと。
0652名無しさん@お腹いっぱい。2009/01/14(水) 03:13:11
シェルスクリプト中にawkみたいな感じで
ペタってコード書ける言語って、
他になにがありますかね。
0653名無しさん@お腹いっぱい。2009/01/14(水) 03:55:52
スクリプト系言語で出来ない方が珍しい。
引数にコード渡せればいいだけだから。
0654名無しさん@お腹いっぱい。2009/01/14(水) 06:50:56
>>649
あなた、微妙に理解がズレてますよ。

>スペースの有る無しは変数名が変わると言うことだし、

じゃなくて、awkは1番目の引数の文字列内容を「プログラム」と認識するので、
シェル上ではスペースを入れないで繋げるということが重要。


>念を押すが、awk (にしろ他のコマンドにしろ)「'」の存在は知らない。

そんなことは当たり前。その点が問題になってるんじゃないの。

>>648 が説明しようとしてるとおり、

awk 'awkのプログラムの前半'"$シェル変数"'awkのプログラムの後半'

と、(クォートの中を除いて)スペースを入れずに書くことが重要で、
これが awkには、
「awkのプログラムの前半」と「$シェル変数の中身」と「awkのプログラムの後半」
が連結されて「1つの引数」として渡される。「1つの引数」が重要。

元の >>644 の質問では、1つの引数の引数になるべきところの途中で
つまり、「awkのプログラムの前半」の最後で一旦シングルクォートが閉じているのに、
なぜそこで引数が分断されないのか? という質問。

それに対して >>646 の回答はズレている。

最初の >>645 の回答が的確。
0655名無しさん@お腹いっぱい。2009/01/14(水) 08:34:47
どっちも言い方は違うけど
間違ってないと思うょ

真っ赤になって相手を否定するのこそ間違ってる
0656名無しさん@お腹いっぱい。2009/01/14(水) 09:21:08
>>649 氏は、
>>645 は、何も言っていないに等しいとしか読めない。」
なんて発言しちゃってるから、

>>645 の意味が理解できてないみたいだね。

>>645 の解答が出た後で、
なんでピンボケな >>646 のカキコがあるのか不思議に思ってた。


あと、>>649 氏の発言をもうひとつ指摘、
「スペースの有る無しは変数名が変わると言うことだし」
もしかして、『変数』と『引数』の用語を混同してますか?
もしスペースがあって、awkプログラム部分が複数の『引数』に分かれてしまうと、
そもそもawkは正常動作しませんよ。変数名が変わるだけの問題では済みません。
0657名無しさん@お腹いっぱい。2009/01/14(水) 13:33:15
>>656
>>>>645 は、何も言っていないに等しいとしか読めない。
のはそのとおりで、実際に質問の答えになっていない。
空白が無いかどうかではなく何でぶった切られないかと言うのが質問。
だから「,」の外側はシェルが解釈出来る内容であれば良いが、
空白があればシェルによって別の引数として扱われるのは別の問題だし、
要するに
awk 'N''R == '`expr 1 + 1`' { pr''in''t'' }' file
がちゃんと動くことの説明としては、不足がある。
0658名無しさん@お腹いっぱい。2009/01/14(水) 13:50:45
空白がないから「1つの引数」になってと説明されて、わからない奴が知能障害。ww
0659名無しさん@お腹いっぱい。2009/01/14(水) 13:56:28
>>658

空白が有っても動く例

echo 'wa' `echo r\`echo o\`` 'ta'

cシェルじゃ動かないが
0660名無しさん@お腹いっぱい。2009/01/14(水) 14:03:49
>>659
それ、3つの引数に分断されるよ。echoだから結局問題にならないだけで、
awkだと動かない。
0661名無しさん@お腹いっぱい。2009/01/14(水) 14:05:40
>>657
> awk 'N''R == '`expr 1 + 1`' { pr''in''t'' }' file

↑は、awkのプログラム部分には空白がないじゃん。
だから「1つの引数になる」という説明(>>645)のとおり。
`expr...`の部分はバッククォートだから、
「クォートされていない空白」はない。


>>646 は、要約すると、「シングルクォートがシェルによって除去されること」
だけしか言ってなくて、それは当たり前だし、それだと、
途中のシングルクォートのところで「なぜ引数が分断しないのか」の
説明になっていない。

本質問者と思われる、>>651 さんが、
>>648 の解答を「なるほど」と言っているので、
質問したかったことは「引数がなぜ1つになるのか」と言うことであることは明らか。


結論: 早期解答の >>645 が正解。
0662名無しさん@お腹いっぱい。2009/01/14(水) 14:16:13
>>661

>>質問したかったことは「引数がなぜ1つになるのか」と言うことであることは明らか。

君はエスパーか?
もし仮にそう言う意図で質問していたとしたら
>>644では言葉が足りなさすぎる。
>>659のようなものに対しても当てはまる質問と読むのが妥当。
従って、>>645は何の説明にもなっていない。

まあ、エスパー相手じゃこっちに勝ち目は無いが。
0663名無しさん@お腹いっぱい。2009/01/14(水) 14:24:31
>>662

× >>645 は何の説明にもなっていない
>>662 の頭脳では、せっかくの >>645 の説明が理解できない。


エスパーしなくても、
もう一度 >>648 の書き込みを見てみろ。
複数のクォート同士を、「空白」を入れた場合と入れない場合で説明してるだろ。
それに対して、質問者が「なるほど」と言って理解したんだから。

ポイントは、シェルの単語分割(引数分割)の際の「空白」について。
0664名無しさん@お腹いっぱい。2009/01/14(水) 14:31:19
エスパーだろ。

>>644>>651 が、同一人物だと見抜けてるし。
>>644 の質問から「引数がなぜ1つになるのか」という意図を見抜いたし。

常人には真似のできないことをするからエスパー。

ちなみに >>648 を何度読んでも
「それはそうですが、何か?」
と言う感想しか抱けない。
0665名無しさん@お腹いっぱい。2009/01/14(水) 14:42:10
>>664
なんだ、>>664>>648 が的を得た解答であることすら理解できてなかったのかw

awkにおいては、awkプログラムを、シェルから見て第1引数(argv[1])に与えることが
重要。

シェルスクリプトの中からawkを呼ぶ場合、awkプログラムの文字列が
シェルに解釈されるのを防ぐため、通常、全体をシングルクォートで囲むが、
そのシングルクォートの中の一部だけ、シェル変数で置き換えたい場合がある。

そんな時は、awkプログラムの途中で一旦シングルクォートを閉じて終了する。
(これが、>>644 が言う「ぶった切れる」)
その直後に、「空白を入れずに」ダブルクォート付きでシェル変数を記述する。
その直後、再び「空白を入れずに」シングルクォートでawkプログラムの続きを書く。

この、複数のシングルクォートやダブルクォート同士の間に空白を入れないこと、
空白を入れるとシェル上で別の引数に分断されること、
awkでは「1つの引数としてプログラムを書く」必要があること、
と言うのが問題の本質。

>>645 はその答を簡潔に先に言っている。
0666名無しさん@お腹いっぱい。2009/01/14(水) 14:53:49
また粘着合戦か
妹が泣いてるぞ
0667名無しさん@お腹いっぱい。2009/01/14(水) 14:56:51
あほらし

>>644は明らかにシェル変数もクォートされていると誤解した書き方だろう。
さらに一個目の「,」と二個目の「,」の間だけがコマンドに渡るはずと言う誤解。
その部分に対して一切>>645は示唆を与えていない。

別にawkだって適正に記述して複数引数として処理出来るようにすれば
クォートの外に意図的に空白を入れることも可能だ。

引数の数云々なんて、>>644からは一切読み取れない。
0668名無しさん@お腹いっぱい。2009/01/14(水) 15:04:36
>>657 = >>667 よ、興奮してるからと言って
シングルクォートとカンマを間違えるな。しかも3回も。

アンタ、もしかしてawkプログラムが複数の引数に分かれて渡されても、
awk側で(例えば BEGIN { と } の対応とかで)適切に連結されて
うまく処理されると誤解してたんじゃない?

だから、>>649 で、
「スペースの有る無しは変数名が変わると言うことだし」
みたいなトンチンカンなことを言ったんでしょ。
0669名無しさん@お腹いっぱい。2009/01/14(水) 15:16:08
>>668
typo位スルーしろ。

そもそも、そんなこと考えようともしないだろ普通。
第一>>645が何も言っていないと言うのと無関係。
そんな変態的な事を考えていたら、>>645が間違いだと突っ込むだろう。

スペースの有る無しは単に変数の内部、つまり$の後ろと勘違いしただけだろう。

で?
0670名無しさん@お腹いっぱい。2009/01/14(水) 15:23:54
>>667
> >>644は明らかにシェル変数もクォートされていると誤解した書き方だろう。
君はエスパーか? www
0671名無しさん@お腹いっぱい。2009/01/14(水) 15:24:10
>>669
>スペースの有る無しは単に変数の内部、つまり$の後ろと勘違いしただけ

ふつー、そんな勘違いあり得ないよ。
そういう勘違いが起きること自体、
この問題の場合は「空白の有無」が重要、ということに
>>669 が気づいていなかった証拠。

だから >>645 を見ても、その意味が >>669 にはわからなかったのだろう。

>>645 は、
「シングルクォートは終了(ぶった切れ)しても、シェルの引数としては続いている」
と言うことを言ってるんだよ。それが的確な答え。
0672名無しさん@お腹いっぱい。2009/01/14(水) 15:26:58
てか、>>665

そんなこと書いて知らない人が鵜呑みにしたらどうするんだ?

0と1は、まあtypoと大目に見ても、
オプションとか全く考慮していないのはどうか?
0673名無しさん@お腹いっぱい。2009/01/14(水) 15:27:29
そろそろサマリをくれ。
0674名無しさん@お腹いっぱい。2009/01/14(水) 15:29:18
>>672
typeじゃないよ。argv[1] で合ってる。
argv[0] は awk の文字列。
0675名無しさん@お腹いっぱい。2009/01/14(水) 15:32:18
>>670

>>正規表現中の「'」
内部に無い以上前後を一括りにしてしまっていると読むのは妥当。

>>671

だから>>644の質問に「空白の有無」なんて重要じゃないと何度言ったら・・
分からなくて当然で、明後日の回答内容なんて気にするわけないだろ。
斜め読みにきまってる。

>>シェルの引数としては続いている

こう言う常人には見えない文字が見えるのがエスパー
0676名無しさん@お腹いっぱい。2009/01/14(水) 15:35:08
>>673
>>665 がサマリとしてもよくまとまってると思う。

>>674 の言うとおり、typoじゃないね。
(674自身はtypeがtypoだがw)
0677名無しさん@お腹いっぱい。2009/01/14(水) 15:35:18
>>674

誰が、処理内容がargv[0]だと言った?

自分で第一引数って書いただろ。
まあ第一と第二のtypoということにしておいてもいいが、
そんなことより根本的におかしいだろ「重要」だなんて。
0678名無しさん@お腹いっぱい。2009/01/14(水) 15:38:27
>>676

そりゃ最悪だ。
嘘を重要といい、
明後日の事をくどくど書いて「問題の本質」だと?
0679名無しさん@お腹いっぱい。2009/01/14(水) 15:41:40
>>677
だからtypoじゃないって。

awk = argv[0] = 第0引数
awkプログラム = argv[1] = 第1引数

awkプログラム部分を「1つの引数にする」「2つ以上に引数に分けてはいけない」
ことは重要。

確かに、-F とか、その他awkのオプション引数が入る場合は
awkプログラム部分は argv[1]より後ろにずれるが、
そういうことを言ってるんじゃない。
0680名無しさん@お腹いっぱい。2009/01/14(水) 15:42:37
>>765
自分が理解できないということすなわち自分が無能であることを、
力説しているキミには同情を禁じ得ない。ww
0681名無しさん@お腹いっぱい。2009/01/14(水) 15:43:20
>>675
自分が理解できないということすなわち自分が無能であることを、
力説しているキミには同情を禁じ得ない。ww
0682名無しさん@お腹いっぱい。2009/01/14(水) 15:46:30
すごいな

苦し紛れに漢数字をアラビア数字に書き換えか。
0683名無しさん@お腹いっぱい。2009/01/14(水) 15:50:34
だからサマリーは
>>665 で決まり。


>>682
>>665 のどこにも漢数字なんてないよ。
苦し紛れに漢数字を勝手に使い出したのは >>677 だろ。
0684名無しさん@お腹いっぱい。2009/01/14(水) 15:51:44
>>675

理解できないんじゃなく価値が低いと看做したから
斜め読みしたと書いたつもりだが?

で、変数のところに空白がはいりゃそりゃ意味が変わるから
動かなくて当然だと早とちりしただけであり、
>>645>>644に対して何も言っていないと言う主張と全く矛盾しない
というか、極めて整合性が有る。
0685名無しさん@お腹いっぱい。2009/01/14(水) 15:54:17
>動かなくて当然だと早とちりしただけであり、

www
なんだ、>>646 の解答はやっぱり「早とちり」だったのか。
それがすべてだな。
0686名無しさん@お腹いっぱい。2009/01/14(水) 16:00:07
まあ良い。
シェルから見て第0引数という表現は
実に気持ち悪いが、まあ無いわけではないから許してやる。

しかしオプションを無視した上に、
別に何の変哲もないことを力説して、
重要だの本質だのというのは頂けない。
しかもawk特有の様に語るところがミスリードを意図しているようで気持ち悪い。

空白をセパレータとして認識するのはシェルだし、
パラメータを複数受け取っても、
それがコマンドにとって適正であれば動くし、
不適であれば動かないという一般的な話なだけであって、
敢えてawkを例に出して力説するような物じゃあ無い。
0687名無しさん@お腹いっぱい。2009/01/14(水) 16:03:59
>>685

恣意的な誘導だな。

>>646ではなく
>>649が早とちり(しかもどうでもよい)

だろ。
0688名無しさん@お腹いっぱい。2009/01/14(水) 16:04:47
>>686
>敢えてawkを例に出して力説するような物じゃあ無い。

あのー、もともとシェルスクリプト(#!/bin/sh)の中から
awkを呼び出す場合の話なんですけどー
敢えてawkを例に出したんじゃなく、
元々がawkを呼ぶ場合の質問。
その場合には「引数を1つにまとめる」ことが重要。
0689名無しさん@お腹いっぱい。2009/01/14(水) 16:11:08
>>686
>しかしオプションを無視した上に、

awkをワンライナー的に使う場合(シェルスクリプトの中のワンライナーも含む)は、
awkに各種オプションを付けることがあるが、

複数行に渡るawkプログラムを記述する場合は、
混乱を避け、書式を統一するためにも
awkのオプションは付けない方が言いよ。

例えば、-fオプションなら、プログラム中でawk変数のFSでセットできるわけだし、
FSの方を使った方が言い。

そういう意味で、awkのプログラムは argv[1]の位置に来る。
0690名無しさん@お腹いっぱい。2009/01/14(水) 16:13:23
>>689
typo発見。

× -fオプションなら、プログラム中でawk変数のFSでセットできる
○ -Fオプションなら、プログラム中でawk変数のFSでセットできる

でも言ってることは合ってるよ。
0691名無しさん@お腹いっぱい。2009/01/14(水) 16:15:18
>>688

#!/bin/sh

A=file1
B=fil2

awk '{
print
}' ''"$A"'' "$B"''

状況次第で引数を分断する事も重要。
0692名無しさん@お腹いっぱい。2009/01/14(水) 16:19:10
>>691
アフォか。

それ、「awkプログラム部分」はどこも分断されてないだろ。

awk自身の引数のファイル名のところの話じゃないんだよ。

主張しているのは「awkプログラム部分を分断せずにひとつの引数にまとめること」
0693名無しさん@お腹いっぱい。2009/01/14(水) 16:22:31
要するに、
>>600が、
書いた本人は勿論そう言うつもりは無いだろうが、
後半の文章だけを取り出すと大間違いなのに
>>665のようなスタンスだと、そのことに気づきにくいのが
問題なんだよ。

動くような引数を渡せば、echoもawkも動くし
そうでなければ、どれも動かない。

単純に引数を一つにまとめるのが重要と
決め打ちするのは良くない。
0694名無しさん@お腹いっぱい。2009/01/14(水) 16:24:27
ああ
>>660
の、間違いね。
0695名無しさん@お腹いっぱい。2009/01/14(水) 16:27:08
しょうもないののしりあいしてるとこに双方タイプミスとかするなよ

↓ 以下、タイプミスした方が論旨関係なく即刻負けね
0696名無しさん@お腹いっぱい。2009/01/14(水) 16:27:18
>>693
awkで、「awkプログラム部分」を、2つ以上の引数に分けて動くような例は
ありえない。

だから、「awkプログラム部分は1つの引数にする」と
決め打ちして何も間違いはないし、より論旨がはっきりする。
0697名無しさん@お腹いっぱい。2009/01/14(水) 16:32:59
>>692

君がそう言いたい事は分かっている。
しかし、君の書き方だと知らない人は確実に誤解する。

そう言う意味で、
>>644が「シングルクォートの後ろで空白が入るとどうなるんですか?」
というような質問でもないのに、>>645を書いたのが
何の説明にもなっていなく、誤解の元だというのが私の唯一の主張。
0698名無しさん@お腹いっぱい。2009/01/14(水) 16:36:25
誤解誤解って、どう誤解するの?確実にっていっても想像でしょ?
0699名無しさん@お腹いっぱい。2009/01/14(水) 18:54:23
>>646は、まだ見苦しく言い訳続けてるの? とことんがんばれ。www
0700名無しさん@お腹いっぱい。2009/01/14(水) 19:01:48
つ−か >>646>>646 を煽ってる奴も
知識レベルは同程度だろう
仲良くしろ
0701名無しさん@お腹いっぱい。2009/01/14(水) 19:23:54
>>645がすべてだからねえ。
それを理解できない馬鹿が己の馬鹿っぷりを力説しているだけ。
0702名無しさん@お腹いっぱい。2009/01/14(水) 22:21:05
>>700

別に知識レベルを争っている訳じゃないだろ。
まあ君のような高尚な知識は、現実世界には不要だろうがね。

>>701

まだ言ってるよ。
馬鹿じゃねーの。

的外れと言う指摘を脳内変換して
間違いだと言われたと勘違いして
相手の論を勝手にでっち上げ、攻撃する屑よ。
0703名無しさん@お腹いっぱい。2009/01/14(水) 22:42:51
まとめると、>>646>>645を理解できない。
0704名無しさん@お腹いっぱい。2009/01/14(水) 22:55:49
>>703

良かったね。
君のところではまともに動く物が、
ウチでは理解出来ないで、空白が混入して動かない訳だ。

君のところが儲かって結構な事じゃないか。
そう解釈してくれるなら、実際ウチも嬉しいから、
がんがれ。
0705名無しさん@お腹いっぱい。2009/01/14(水) 23:02:57
>>645
は何の実例も提示せず、後付の言い訳に終始する。
>>646は、豊富な実例を実際に表記している。

この一事をもってして、軍配がどちらに上がるか
自明の事であろう。
0706名無しさん@お腹いっぱい。2009/01/14(水) 23:09:34
まとめると、>>646>>645を理解できない。
0707名無しさん@お腹いっぱい。2009/01/14(水) 23:14:12
>>690の自演も見苦しい。

そもそも重要なのは>>689の言う
-f オプションは、関数などをライブラリ化したファイルを読むのに
必須であり、決してシェルスクリプト中にオプションを記述するのが
忌避されている訳ではない証左ということ。
ちなみに-vオプションだって頻繁に使う。
-Fだってケースバイケースなのに無理やり自己の論に
押し込めようとするから破綻する。

とにかく、自分の枠で決めつけるのはよせ。
0708名無しさん@お腹いっぱい。2009/01/14(水) 23:14:48
>>705
お前ほんとに >>646 本人か?

>>646 の発言として
>>697 より引用するが、

> >>644が「シングルクォートの後ろで空白が入るとどうなるんですか?」
> というような質問でもないのに、>>645を書いたのが
> 何の説明にもなっていなく、誤解の元だというのが私の唯一の主張。

「唯一の主張」って言ってるね。
つまり、>>646 は、>>644 の解答は的はずれだったことは暗に認めているわけだ。
そして、残った「唯一の主張」として、>>645 の解答でも「誤解の元だ」
と言ってるに過ぎない。
実際には誤解の元とは思わないが、少なくとも >>645 の解答で正解なのは事実。

よって、軍配はすでに >>645 に上がっていることを >>646 も認めている。
0709名無しさん@お腹いっぱい。2009/01/14(水) 23:19:46
同じような書き込みを何回もするなよ
0710名無しさん@お腹いっぱい。2009/01/14(水) 23:21:29
>>707
それは awkプログラム文字列が argv[1]の位置に来ることが多いから
わかりやすくそう言っているだけで、
論点は「ひとつの引数にプログラムをまとめる」ことだから、
今の議論と関係ない -v とか-F オプションを持ち出すのは論点をぼかすだけだよ。
だからあえてオプションのことは言わずに argv[1]と言っただけのことと思われる。
0711名無しさん@お腹いっぱい。2009/01/14(水) 23:24:34
馬鹿でもわかるように1行にまとめてやろう。>>646>>645を理解できない。
0712名無しさん@お腹いっぱい。2009/01/14(水) 23:25:57
>>707
どうでもいいが、ワンライナーでもないのに awk の -v オプションを使うのは
非常にお勧めしない。
きちんと BEGIN { } の中で変数に代入すること。

あと、-f は #!/usr/bin/awk -f なスクリプトの場合に使うべきもので、
シェルスクリプト中にawkプログラムを各場合は、-f オプションとは両立しない。
(-f を付けたら引数からはプログラムを読まなくなるので)
0713名無しさん@お腹いっぱい。2009/01/14(水) 23:32:52
>>712

パラドックスを書くな。

-f も、-v も何度でも使える。
0714名無しさん@お腹いっぱい。2009/01/14(水) 23:35:36
>>713
「何度でも使える」かどうかを言ってるんじゃないよ。

じゃあ聞くが、

awk -f prog-file

って書く場合に、どうやってawkの引数にプログラムを記述するんだ?
別ファイルじゃなくて、引数に直接プログラムを記述したい場合、
-fオプションは使えないだろw
0715名無しさん@お腹いっぱい。2009/01/14(水) 23:40:30
その場合、普通に書けば委員ジャマイカ?

この一時を以ってしても、
第○引数がどうでも良いことがわかるね。
0716名無しさん@お腹いっぱい。2009/01/14(水) 23:46:59
>>715
試してから書け。

awk -f prog 'BEGIN { ... }'

なんて書いても動かないぞ。

awk -f progfile

awk progstring
とは
エクスクルーシブ。
同時に使えない。
0717名無しさん@お腹いっぱい。2009/01/15(木) 00:05:35
1000まで続けるつもりですね。
0718名無しさん@お腹いっぱい。2009/01/15(木) 00:05:56
>>716

それって言っていることは>>714と同じだよね。
普通に書けば?
■ このスレッドは過去ログ倉庫に格納されています