我有一个像
这样的文件line1 word1 word2 word4 etc..
line2 word1 word2 word4 etc..
我知道我可以使用cut -d ' ' -fx
命令提取单词,但我想在一次操作中提取和分配多个单词。
while read line;do
echo $line | awk '{ word1=$1; word2=$2 }'
# usage $word1, $word2, etc.
done < $file
这可能吗?
jose 1234 2011/12/01
maria 2345 2010/04/10
脚本
while read line;do
echo $line | awk '{ name=$1; counter=$2, date=$3 }'
# usage $name, $counter, $date, etc
done < $file
答案 0 :(得分:6)
如果一行中的单词数是固定的(简单情况),那么:
while read name number date
do
# ...use $name, $number, $date
done <<'EOF'
jose 1234 2011/12/01
maria 2345 2010/04/10
EOF
请注意,如果该行中有4个或更多单词,$date
将获取姓名和号码后面的所有剩余单词。如果少于三个,read
将有效,但没有值(date
或number
或甚至name
)的变量将为空字符串。
如果一行中的字数是可变的,那么您可能希望将bash
arrays与read
一起使用:
while read -a array
do
# ...process "${array[@]}"...
echo "${array[@]}"
done <<'EOF'
one
two three
four five six
seven eight
nine
EOF
答案 1 :(得分:3)
可以使用awk
root@server$ vars=$( awk '{for(i=1;i<=NF;i++){ print "word" i "=" $i }}' file )
root@server$ echo $vars
word1=one word2=two word3=three
root@server$ declare $vars
root@server$ echo $word1
one
所以细分
Awk有内部变量NF,它是行中的字段数。因此,我们在所有字段上运行快速for循环,跳过字段0作为整个行。对于每次迭代,我们打印出一个bash变量赋值语句,并将输出捕获到vars变量中。
然后我们使用declare来声明变量。如果我们不使用declare,那么我们在文件中执行一些任意代码。希望这很有用。