我有一系列大型 (25-250MB) 制表符分隔的文本文件,我需要将其转换为 SQL 格式以进行批量插入。我对 awk 非常陌生,所以我不知道自己在做什么。我所知道的是我需要解决方案来在尽可能短的时间内处理数据。结果,我的尝试是无力的。我试图通过使用 sed(总集群)和 awk 在每个文件上进行三个单独的传递来实现以下目标;像这样...
第 1 遍:awk '{gsub(/%J\t/,"\(\'")}1' file.txt
第 2 遍:awk '{gsub(/\n,"\'\)\n")}1' file.txt
第 3 步:awk '{gsub(/\t/,"\',\'")}1' file.txt
由于我严重缺乏使用 awk 的经验,当我尝试上述操作时,终端会切换到一个新的提示符,就像它在等待更多信息而不是执行命令一样。
这是整个文件中数据格式的示例。
每一行的结构如下:
%J\t数据\t数据\t数据\t数据\t数据\n
我想使用 awk 或类似的工具将每一行重组为以下格式:
('DATA','DATA','DATA','DATA','DATA',@id)\n
注意:如果我的格式不正确,我深表歉意。这是我在 Stack 上的第一篇文章。
提前感谢大家抽出宝贵时间帮助完成这件事!
最佳答案
像这样的东西应该可以解决问题:
awk -F"\t" -v q="'" '{printf "("}{for (i=2;i<=NF;i++){printf "%s\t", q $i q}}{print "@id)"}'
这是说:
- 按制表符拆分每条记录
-F"\t"
- 设置变量
q
单引号:-v q="'"
- 打印出起始括号
'{printf "("}
- 从第 2 列开始遍历记录中的每一列
for (i=2;i<=NF;i++)
- 打印列,然后用单引号将列括起来(使用变量):
printf "%s\t", q $i q
- 最后打印出文字
@id
后跟使用print
的右括号命令,以便它在打印结束时弹出一个回车符:print NR")"
:~> cat testfile
%J D1 D2 D3
%J D2 D3 D4
:~> awk -F"\t" -v q="'" '{printf "("}{for (i=2;i<=NF;i++){printf "%s\t", q $i q}}{print "@id)"}' testfile
('D1' 'D2' 'D3' @id)
('D2' 'D3' 'D4' @id)
关于regex - 使用 awk 替换大文件中每行的开始和结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48906848/