我有一系列大的(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□\吨数据 \吨数据 \吨数据 \吨数据 \吨的 DATA \ n
我想使用awk或其他东西来快速地将每一行重构为以下格式:
('DATA','DATA','DATA','DATA','DATA',@id)\n
注意:如果我没有正确的格式,我会道歉。这是我在Stack上的第一篇文章。
提前感谢大家的时间和帮助!
答案 0 :(得分:0)
这样的事情可以解决问题:
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 "("}
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)
答案 1 :(得分:0)
使用(g)awk
选项并使用@ JNevill的输入文件
$ awk -F'\t' -v RS='%J' -v ORS="',@id)\n" -v OFS="','" -v q="('" 'NF{$1=q $1; print}' file
('D1','D2','D3',@id)
('D2','D3','D4',@id)
答案 2 :(得分:0)
这是有效的。首先,谢谢JNevill和karakfa!你们都让这成为可能,我学到了很多东西!!
INPUT
%J 1381 443 3 201-GE General 7850410 Control Systems 443
%J 1382 443 3 201-GE General 7850250 Mechanical 443
%J 1383 443 3 201-GE General 7850400 Electrical 443
CODE
dos2unix test.txt // Ran this first to clean up the '\r's in the file.
awk -F"\t" -v RS='%J\t' -v ORS="',@id)\n" -v OFS="','" -v q="'" 'NF{$1="("q $1; print}' test.txt > test_.txt // Then ran this to finish the job
OUTPUT
('1381','443','3','201-GE','General','7850410','Control Systems','443',@id)
('1382','443','3','201-GE','General','7850250','Mechanical','443',@id)
('1383','443','3','201-GE','General','7850400','Electrical','443',@id)
多田!再次感谢。现在我只需要做一些GC,所有都是bueno。