- ベストアンサー
Linux環境下でtest.csvの内容を順に読み込んでファイルをコピーする方法
- 9月に初めてITエンジニアとしてスタートしましたが、Linux 5の環境下でtest.csvの内容を順に読み込んでファイルをコピーする方法が分かりません。awkの組込変数NRが外部変数として使えないようで、困っています。
- 初心者のITエンジニアですが、Linux 5の環境下でtest.csvから行の1フィールド目を読み込んでファイルをコピーする方法を知りたいです。awkの組込変数NRを外部変数として使えないため、進めません。
- 9月にITエンジニアとしてデビューした初心者です。Linux 5の環境でtest.csvから1フィールド目を順に読み込んでファイルをコピーする方法について教えてください。awkの組込変数NRを外部変数として使えないため、困っています。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
つい先日も書いたんだけど http://okwave.jp/qa/q6150647.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は実に便利なプログラム言語です。 解説書や解説サイトも沢山あるので、勉強してみてください。
お礼
非常に曖昧な質問に対して、理解し易いご回答ありがとうございます。 慣れてないという事ではなく、根本の理解不足と勉強不足を痛感しました。 kmeeさんのようになれるには、どのくらいの期間を要するのか興味のある所ですが、 これからも解説書や解説サイトで勉強していきます。 本当にありがとうございました。