将数据从文本文件导入到 bash 脚本

将数据从文本文件导入到 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 脚本中。

我想为每个符号运行一次程序。这些符号是纳斯达克股票符号。我试图在脚本中引用一段话。

我已经能够手动执行此命令:

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

通过手动输入(符号),我需要一个脚本来自动执行此操作。

答案1

您是否尝试将每一行视为符号?

将 25 个条目放在名为stocks.txt 的文件中。然后使用以下脚本迭代stocks文件中的每一行,并使用同一脚本中声明的stock函数处理代码:

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

答案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可能是处理该符号的函数。如果您不想编写函数,只需将相关代码行放在那里即可。

将外部文件中的数据作为参数传递给 shell 脚本:

A相关解决方案已发布者纽乌尔夫33。我只是通过更正来重现:

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

答案3

如果要循环遍历文件的行,可以read在循环中使用内置函数,如下所示:

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

该行的内容存储在变量中line(您可以选择任何其他名称)。看了解 IFS以获得更多解释。如果没有IFS=,前导或尾随空格将被删除,这在您的情况下可能是理想的。

请注意>stockquote.txt每次都会截断输出文件。要么将它放在整个命令中,要么使用>>stockquote.txt它附加到文件中。如果您使用>>,请注意脚本启动时该文件可能不为空。

此代码片段为每一行运行程序stock,并将输出存储在每个符号之间的stockquote.txt空行(echo不带参数)中。

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

确保它stock是可执行的。如果它是 shell 脚本,请确保它以#!/bin/sh。如果它不在命令搜索路径中$PATH,请显式指定路径(例如,./stock如果它在当前目录中)。

您也可以使用xargs,但要注意它的输入语法很特殊:它不使用换行符作为分隔符,而是使用空格,并将其视为\'"引用字符(使用默认输入语法 - 只是让事情变得更糟, xargs 有替代输入语法,具体取决于在其命令行选项上)。对于您的用例,这可能也合适,而且更短,但是您失去了在符号中包含空格或引号字符、跳过注释行等的机会。

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

相关内容