• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:この9月にITエンジニアとしてスタートしたばかりの、初心者で恐縮なので)

Linux環境下でtest.csvの内容を順に読み込んでファイルをコピーする方法

このQ&Aのポイント
  • 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を外部変数として使えないため、困っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.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は実に便利なプログラム言語です。 解説書や解説サイトも沢山あるので、勉強してみてください。

kurokuro64
質問者

お礼

非常に曖昧な質問に対して、理解し易いご回答ありがとうございます。 慣れてないという事ではなく、根本の理解不足と勉強不足を痛感しました。 kmeeさんのようになれるには、どのくらいの期間を要するのか興味のある所ですが、 これからも解説書や解説サイトで勉強していきます。 本当にありがとうございました。

関連するQ&A