0

我有一个像

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 
4

2 回答 2

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则将起作用,但没有值(或什至)的变量datenumbername空字符串。

如果一行中的单词数是可变的,那么您可能希望使用bash 数组read

while read -a array
do
    # ...process "${array[@]}"...
    echo "${array[@]}"
done <<'EOF'
one
two three
four five six
seven eight
nine
EOF
于 2013-01-17T15:56:42.310 回答
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 来声明变量。如果我们不使用声明,那么我们将在文件中执行一些任意代码。

希望这是有用的。

于 2013-01-17T16:03:47.583 回答