Bash Unix:从.dat文件提取数据并插入SQL数据库?

Bash Unix:从.dat文件提取数据并插入SQL数据库?,bash,shell,unix,grep,extract,Bash,Shell,Unix,Grep,Extract,大家好,我需要处理大约1000个.dat文件,每个文件都有大约1000个用户的数据。文件格式如下(实际上,数据当然是填写的:John,18,john@email.com例如-我仅对其进行编号以突出订购问题): 实际上,我在想,如果我可以按照这个顺序提取数据会更好,尽管我不知道使用grep是否可以做到这一点 Name_1 Email_1 Name_2 Email_2 (etc) 因为如果数据是这样提取的,那么我可以将值存储在shell变量中,然后使用以下内容添加到数据库中: sqlite d

大家好,我需要处理大约1000个.dat文件,每个文件都有大约1000个用户的数据。文件格式如下(实际上,数据当然是填写的:John,18,john@email.com例如-我仅对其进行编号以突出订购问题):

实际上,我在想,如果我可以按照这个顺序提取数据会更好,尽管我不知道使用grep是否可以做到这一点

Name_1
Email_1

Name_2
Email_2

(etc)
因为如果数据是这样提取的,那么我可以将值存储在shell变量中,然后使用以下内容添加到数据库中:

sqlite db.sql INSERT INTO users VALUES ($name, $email);
或者类似的东西,如果那样行得通的话

无论如何,我希望我已经半清楚地解释了我自己,不过如果有人能在这方面帮助我,我将不胜感激。实际上,我是在问,是否有可能对一个用户、一封电子邮件、另一个用户和相应的电子邮件进行grep…而不是grep的工作方式,通过提取所有用户,然后提取所有电子邮件。也许还有另一个功能可以很好地完成这项工作


干杯

对于
grep
sed
来说,这不是一个好问题。我推荐
awk
。未经测试的第一次切割:

awk '
/<Name>/ {name=$1}
/<Email>/ {emails[name] = $1}

END {for (n in emails) {print n, print email[n]}}
' *.dat
您可以在(GNU)sed中完成,尽管awk脚本要简单得多

dat2sql.sed:

/<NAME>/I H  # store name
/<EMAIL>/I {
  H;         # store email
  g          # get stored strings

  s/<[^>]+>\s+//gI; # remove <NAME> and <EMAIL>

  s/^$\n/sqlite db.sql INSERT INTO users VALUES ("/;
  s/\n/", "/;
  s/$/" );/;

  p                 # print results
  s/.*//g;  x;      # clear hold space
} 
//I H#商店名称
//我{
H、 #存储电子邮件
g#获取存储的字符串
s/]+>\s+//gI;#删除并删除
s/^$\n/sqlite db.sql插入用户值(“/”;
s/\n/“,”/;
s/$/”;/;
打印结果
s/*//g;x;#清除保留空间
} 
像这样使用它:
sed-rn-f dat2sql.sed您的_文件


先决条件是文件中每条记录的名称都在电子邮件之前。

似乎你是
grep
的超级粉丝。试一试:

grep -Po '(?<=(Name|mail)>[\t\s])(.*)$' file | `xargs -n2 printf "sqlite db.sql INSERT INTO users VALUES (%s, %s)\n"`
xargs-n2
将姓名和电子邮件结合在一起,如下所示:

(--File 1--)
Name_1
Name_2
Email_1
Email_2
(--File 2--)
Name_1001
Name_1002
Email_1001
Email_1002
(etc)
Name_1 Email_1
Name_2 Email_2
这由
printf
格式化并正在执行。希望能有帮助


现在请不要告诉我您的grep不支持
-p
;-)

您的数据是否实际包含_1、_2等?约翰1号,21号,John@email_1----Doe_2,22_2,Doe@email_2.不,它是完全随机的,就像john@email.com正如你提到的。我将具体说明这一点。我只是用数字来显示订单…我想,但想确定。哈哈,不用担心。耻辱我不能投票给你…猜我的帐户有太低的名声或某事:(正如其他人回答,<代码> AWK < /代码>可能是一个很好的赌注;输出插入语句,因为他们做的是好的,但是你也可能想考虑CSV格式的输出,因为“从CSV导入”通常是一种将数据输入数据库的简单方法。另一种可能是使用
perl
和数据库连接模块,在文件处理过程中实际执行插入操作。
/<NAME>/I H  # store name
/<EMAIL>/I {
  H;         # store email
  g          # get stored strings

  s/<[^>]+>\s+//gI; # remove <NAME> and <EMAIL>

  s/^$\n/sqlite db.sql INSERT INTO users VALUES ("/;
  s/\n/", "/;
  s/$/" );/;

  p                 # print results
  s/.*//g;  x;      # clear hold space
} 
grep -Po '(?<=(Name|mail)>[\t\s])(.*)$' file | `xargs -n2 printf "sqlite db.sql INSERT INTO users VALUES (%s, %s)\n"`
Name_1
Email_1
Name_2
Email_2
Name_1 Email_1
Name_2 Email_2