HP-UX General
1820881 メンバー
3702 オンライン
109628 解決策
新規ポスト

csh+awkの具体的使い方をアドバイスいただけませんか?

 
鈴木
新しいメンバー

csh+awkの具体的使い方をアドバイスいただけませんか?

鈴木と申します。

下記のような初期ファイルを修正後の状態に

csh+awkでやりたいと考えています。行数は

10000行くらいあります。$aaaa行に管理番号が

あり、その管理番号を行頭に付けたいんです。

abcdefgh....行は、任意の行数ですが、必ず

$aaaa行で、管理番号が更新されたアスキー

ファイルになります。アドバイスいただけ

ないですか?。よろしくお願いします。

---------start-初期ファイル--

$aaaa 200

{

a=1

b=2

}

$aaaa 205

{

a=6

b=20

c=25

d=40

}

$aaaa 400

{

b=66

}

$aaaa 1250

{

a=66

b=2

m=21

}

---------end---初期ファイル--

---------start-修正後--------

200:$aaaa 200

200: {

200: a=1

200: b=2

200: }

205:$aaaa 205

205: {

205: a=6

205: b=20

205: c=25

205: d=40

205: }

400:$aaaa 400

400: {

400: b=66

400: }

1250:$aaaa 1250

1250: {

1250: a=66

1250: b=2

1250: m=21

1250: }

---------end---修正後--------

4件の返信4
cf
レギュラーアドバイザー

csh+awkの具体的使い方をアドバイスいただけませんか?

こんばんは、

要件からはずれますが、cshもawkも不慣れなので、posix-shで作ってみました。

提示されたファイルでは動くと思いますが、エラー処理や想定外の値でどうなるかは(?)です。

アルゴリズムは次のようなものです。

1. 一行読み込む

2. 行の終わりなら終了

3. 読み込んだ行を$aaaaが含まれていれば2つに分ける

4. $aaaaがあれば、先頭に書き出す内容を$aaaaの次の文字に置き換える。

5. 読み込んだ1行の先頭に、$aaaaの次の文字とコロンをつけて書き出す。

次の内容をinsnum.sh というファイルに書いて、

sh insnum.sh < 入力ファイル > 出力ファイル

と実行すると動くはずです。

$aaaa がある行の判定などが、いい加減なので、区切りが空白3文字でないと動きません。

=========insnum.sh==============

#!/usr/bin/sh

MarkText='$aaaa'

BlockNum='0000'

while read OneLine ;

do

FirstWord=${OneLine%% *}

LastStrings=${OneLine#${MarkText} };

if ];

then

BlockNum=${LastStrings};

fi

print ${BlockNum}':'${OneLine}

done

=========insnum.sh==============

でも、どこかの課題の代筆だとしたら、とても悲しい。

????_92
新しいメンバー

csh+awkの具体的使い方をアドバイスいただけませんか?

awkコマンド一発で。

awk '{if($1=="$aaaa")header=$1;print header ":" $0}' 初期ファイル

"$aaaa"が現れるフィールドや管理番号のフィールドが変わってくるならもうちょっと工夫が必要ですが。
????_92
新しいメンバー

csh+awkの具体的使い方をアドバイスいただけませんか?

間違ってました。訂正します。

awk '{if($1=="$aaaa")header=$2;print header ":" $0}' 初期ファイル

1行目に"$aaaa"行がないと、"$aaaa"行まで管理番号が空になります。
鈴木
新しいメンバー

csh+awkの具体的使い方をアドバイスいただけませんか?

みなさんありがとうございました。awk処理で思って

いたことができました。環境的には、cr5000pws@hpuxでの、アスキーファイルの加工をしたかったのです。

大変に助かりました。