使用awk替换大文件中每行的开始和结束

时间:2018-02-21 13:11:40

标签: regex linux awk gawk

我有一系列大的(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上的第一篇文章。

提前感谢大家的时间和帮助!

3 个答案:

答案 0 :(得分:0)

这样的事情可以解决问题:

awk -F"\t" -v q="'" '{printf "("}{for (i=2;i<=NF;i++){printf "%s\t", q $i q}}{print "@id)"}'

这说:

  1. 按标签-F"\t"
  2. 拆分每条记录
  3. 将变量q设置为单引号:-v q="'"
  4. 打印出一个起始括号'{printf "("}
  5. 从第2列for (i=2;i<=NF;i++)
  6. 开始,遍历记录中的每一列
  7. 打印列,然后在单引号中使用围绕列的标签(使用变量):printf "%s\t", q $i q
  8. 最后使用@id命令打印文字print后跟一个右括号,以便在打印结束时弹出一个回车符:print NR")"

  9. :~> 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。