アプリ版:「スタンプのみでお礼する」機能のリリースについて

この9月にITエンジニアとしてスタートしたばかりの、初心者で恐縮なのですが、
linux 5の環境下で下記のような事をしようとしています。

■test.csvの内容を読み込んで結果を出力し、その出力結果を使う。

test.csvの内容
001.txt,100,200
002.txt,300,400

このtest.csvから各行の1フィールド目を順に読み込んで
cp -p 001.txt 001_200.txt
cp -p 002.txt 002_300.txt
という感じで新しくファイルをコピーして作成しようと考えています。

awkで順に出力してコピーしようとしたのですが、
組込変数のNRがawk内で外部変数(?すみません、ここがよく理解できていません)を使えないように
思えて前に進めない状態です。

NR==i (NR==${i}と記述するのはNG??)として
for i `seq 1 N`
do
a=`awk BEGIN{FS=","}(NR==i){print $2}`
done
のように書きたいのですが、これはawkの文法から不可能なのでしょうか?

大変申し訳ございませんが、追記・追加情報必要であれば補足します。
雲をつかむようですみません。全部のコード(?)を載せるのは仕事上まずいかなと思いまして
こんな書き方になってしまいました。

A 回答 (1件)

つい先日も書いたんだけど


http://oshiete.goo.ne.jp/qa/6150647.html

awkとシェルとはまったく別と言ってよい処理系なので、シェルの変数の内容をawkに渡すには
・シェルの置換機能を使って、awkスクリプト文字列に埋め込む
・awk の -v オプションでawkの変数に代入する
という方法を使います。


ただね.....
多分、他の言語(CとかBasicとか)の考え方なのかもしれませんが、NR==で行番号指定して処理するのって、(数行だけならともかく)全行にわたって行うのはすごい無駄です。
特に、この例では行番号は関係ないですから。
先のURLにあるような方法で1行ずつ行う方が効率はいいです。

さらに言えば、処理がそのコピーだけなら、シェル変数に代入する必要すらなく、1行でできます
awk 'BEGIN{FS=","} {prinf "cp %s %s_%s.txt" $1,$2,$3}' < test.csv | sh
shを使わず、awkのsystem関数を使う方法もあります
awk 'BEGIN{FS=","} {system( sprinf("cp %s %s_%s.txt" $1,$2,$3))}' < test.csv
あるいは、awkを使わずsedで
sed 's/^\([^,]*\),\([^,]*\),\([^,]*\).*/cp \1 \2_\3.txt/' test.csv | sh
先頭の指定行だけ処理したいのなら、headコマンドで
head -10 test.csv | sed 's/^\([^,]*\),\([^,]*\),\([^,]*\).*/cp \1 \2_\3.txt/' test.csv | sh
(この例は10行)
等々

パイプを使った処理はUnix系OSの肝とも言えるものです。
また、awkは実に便利なプログラム言語です。
解説書や解説サイトも沢山あるので、勉強してみてください。
    • good
    • 0
この回答へのお礼

非常に曖昧な質問に対して、理解し易いご回答ありがとうございます。
慣れてないという事ではなく、根本の理解不足と勉強不足を痛感しました。

kmeeさんのようになれるには、どのくらいの期間を要するのか興味のある所ですが、
これからも解説書や解説サイトで勉強していきます。

本当にありがとうございました。

お礼日時:2010/09/06 01:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!