web-dev-qa-db-ja.com

テキストファイルからbashスクリプトへのデータのインポート

以下のようなテキストファイルをインポートする必要があります。

AMBI
CBNK
CCXI
CERE
CLACW
CNYD
DAEG
DLIA
DLLR
DNDN
DSGX
HAST
HIBB,
HPOL
IRDMZ
MARK
NEPT
NFEC
NINE
NRCIB
OMER
PLCC
PLPM
PSUN
UNTK

エントリは25個ありますが、bashスクリプトに渡す必要があります。

シンボルごとに1回ずつプログラムを実行したい。シンボルはナスダックの銘柄記号です。スクリプトで引用を引っ張ろうとしています。

私はこのコマンドを手動で行うことができました:

sh stock (symbol) > /home/user/Desktop/stockquote.txt

(記号)を手動で入力することにより、自動的に実行するスクリプトが必要です。

3
user177073

各行をシンボルとして読み取ろうとしていますか?

25のエントリがstocks.txtというファイルにあるようにします。次に、次のスクリプトを使用して、stocksファイルの各行を反復処理し、同じスクリプトで宣言されたstock関数を使用してシンボルを処理します。

while read symbol ; do 
  stock $symbol >> /home/user/Desktop/stockquote.txt 
done < stocks.txt
2
neowulf33

どうやら、質問のタイトルと本文は私にはまったく同じようには見えませんでした。 2つのソリューションがあります。

外部ファイルからBashスクリプトへのデータのインポート:

ファイルを読み取り、その内容をエントリーとして配列に保管します。 (:これは、テキストファイルの内容を考えると実現可能です。たとえば、ファイルのいずれかの行に引用符のない複数の単語がある場合、そのように形成された配列は希望)

declare -a symbols=($(cat input_file.txt | tr '\n' ' '))

次に、配列symbolsの項目を次のように反復します。

LOG_FILE=/home/user/Desktop/stockquote.txt    

for symbol in ${symbols[@]}  
do  
    # echo "Processing $symbol ..."  
    sh stock "$symbol" >> "$LOG_FILE"    
done

実際、これをstockという名前のスクリプトに埋め込むことができます。 sh stock "$symbol"上記のようなものに:

f_process "$symbol" >> "$LOG_FILE"    

どこ f_processはおそらくシンボルを処理する関数です。関数を記述したくない場合は、関連するコード行をそこに配置するだけです。

外部ファイルからデータを引数としてシェルスクリプトに渡す:

関連ソリューションneowulf によってすでに投稿されています。修正してそれを再現しています:

LOG_FILE=/home/user/Desktop/stockquote.txt 
while read symbol    
do  
    stock "$symbol" >> "$LOG_FILE"
done < input_file.txt
1
Barun

ファイルの行をループしたい場合は、次のようなループでreadビルトインを使用できます。

while IFS= read -r line; do
  echo "$line"
done <input_file.txt

行の内容は変数lineに格納されます(他の名前を選択できます)。詳細については IFSについて を参照してください。 IFS=がない場合は、先頭または末尾の空白が削除されます。これは、場合によっては望ましいかもしれません。

>stockquote.txtは毎回出力ファイルを切り捨てることに注意してください。コマンド全体を囲むか、ファイルに追加する>>stockquote.txtを使用します。 >>を使用する場合は、スクリプトの起動時にファイルが空にならないように注意してください。

このスニペットは、各行に対してプログラムstockを実行し、各記号の間に空白行(引数なしのecho)を付けてstockquote.txtに出力を格納します。

while read -r line; do
  stock "$line"
  echo
done <input_file.txt >stockquote.txt

stockが実行可能であることを確認してください。シェルスクリプトの場合は、 #!/bin/sh で始まることを確認してください。コマンド検索パス$PATHにない場合は、パスを明示的に指定します(たとえば、現在のディレクトリにある場合は./stock)。

xargsを使用することもできますが、その入力構文は特殊です。改行を区切り文字として使用せず、空白文字を使用し、\'"を引用文字として扱います(デフォルトの入力構文では、さらに悪いことに、xargsには、コマンドラインオプションに応じて代替入力構文があります。ユースケースでは、これもおそらく適切であり、短くなりますが、記号に空白文字や引用符文字を入れたり、コメント行をスキップしたりする機会が失われます。

xargs -n 1 stock <input_file.txt >stockquote.txt