1

我正在尝试编写一个 bash 脚本,该脚本将获取一个文本文件并使用其内容来填充 MySQL 表。

文本文件包含许多我需要添加到表中的条目。

文本文件内容示例:

Firstname=bob
Surname=ross
Age=9
Firstname=gary
Surname=graeme
Age=19
Firstname=henry
Surname=harry
Age=23

文本文件的结构与上面的示例类似,相同的 3 个变量不断为将进入 mysql 表的每个唯一条目分配新值。

我使用 sed 删除了文本文件中我不想处理的所有空行和以“#”开头的行。

我的问题是如何使用 bash 使用文本文件中的内容每三行插入一次 sql 以生成 mysql 查询。我知道我需要一次遍历文件 3 行,直到到达文本文件的末尾并以某种方式解析“=”之后的每个值并将其分配给循环迭代中的变量以插入 mysql 数据,但我是不知道该怎么做。

我知道我需要每 3 行有一个新的表条目。

echo "INSERT INTO $table (Firstname, Surname, Age) VALUES ('$Firstname', '$Surname', '$age');" | mysql $db

谢谢

4

2 回答 2

1

我拆分输入中的每一行=并使用第二部分。
然后我将它传送到我用来填充循环内变量的while-loop 。read fname sname ageNR % 3==0 {print("")}过去每三行在输出中引入一个换行符。

awk -F"=" '{printf("%s ", $2)}; NR % 3==0 {print("")}' input_file | \
while read fname sname age; do
    echo "INSERT INTO $table (Firstname, Surname, Age)
      VALUES ('$fname', '$sname', '$age');" | mysql $db
done

更新:
输入:

Firstname=bob
Surname=ross
Age=9
Activity=1 2 3 4 5
Firstname=gary
Surname=graeme
Age=19
Activity=1 2 3 4 5
Firstname=henry
Surname=harry
Age=23
Activity=1 2 3 4 5

使用此代码:

awk -F"=" '{printf("%s ", $2)}; NR % 4==0 {print("")}' input | \
while read fname sname age act; do
    echo "'$fname', '$sname', '$age', '$act');" 
done

给出:

'bob', 'ross', '9', '1 2 3 4 5');
'gary', 'graeme', '19', '1 2 3 4 5');
'henry', 'harry', '23', '1 2 3 4 5');
于 2012-08-14T14:23:13.653 回答
0

如果可以更改文件的结构,请尝试使用LOAD DATA INFILE ...指令。详细规格在这里。这比你自己写要快得多:)

如果没有,试试这个

于 2012-08-14T13:00:50.633 回答