我有一个带有三个参数的bash脚本,我有一个包含三列的文本文件。我希望脚本将文本文件的第一,第二和第三列作为bash脚本的第一,第二和第三个参数。
我是shell脚本的初学者,我正在运行效率不是很重要的相当简单的程序,所以更简单的修复程序将不胜感激:)
以下是我想要做的一个例子。
我有一个名为food.txt的文本文件,其中包含以下文字:
fruits apples bananas
vegetables kale broccoli
meats pork beef
desserts cake pie
我有一个像这样的menu.sh脚本
#!/bin/bash
arg_1=$1
arg_2=$2
arg_3=$3
for arg_1 in $(cat food.txt)
do
echo "${arg_1}:${arg_2},${arg_3}"
done
我想将menu.sh输出:
fruits:apples,bananas
vegetables:kale,broccoli
meats:pork,beef
desserts:cake,pie
但它输出了这个:
fruits:,
apples:,
bananas:,
vegetables:,
kale:,
...
提前感谢您的帮助!
答案 0 :(得分:1)
使用 bash
read
功能的正确方法:
#!/bin/bash
while read -r arg_1 arg_2 arg_3; do
echo "${arg_1}:${arg_2},${arg_3}"
done < food.txt
https://www.gnu.org/software/bash/manual/bash.html#Bash-Builtins
答案 1 :(得分:0)
答案 2 :(得分:0)
cat food.txt | while read line
do
header="$(echo "$line" | cut -f1 -d' ')"
fields="$(echo "$line" | cut -f2,3 -d' ' | tr ' ' ,)"
echo "$header:$fields"
done
如果您添加了其他字段/列,则可以将2,3
更改为2,3,4
或2-4
。如果每行都有可变数量的字段,则可以将其更改为2-
。
答案 3 :(得分:0)
另一种有趣(但不是最佳)的方法是使用IFS var(内部字段分隔符)。它在bash中用于说明如何在for循环中分隔字段:
#!/bin/bash
file=$(cat food.txt)
IFS_OLD=$IFS
IFS=$'\n'
for line in $file; do
name=$(echo "$line" | cut -d' ' -f1 )
element1=$(echo "$line" | cut -d' ' -f2)
element2=$(echo "$line" | cut -d' ' -f3)
echo "$name:$element1,$element2"
done
IFS=$IFS_OLD
请注意,备份和恢复原始IFS值非常重要。正如我所说,不是最优,其他答案更好,但这仍然是另一种选择
答案 4 :(得分:0)
或者你可以这样做:
#!/bin/bash
IFS=$'\n'
for arg in $(cat food.txt); do
echo $arg | awk '{ print $1":"$2","$3 }'
done
或:
#!/bin/bash
awk '{ print $1":"$2","$3 }' food.txt