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

标签 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\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)"}'

这是说:

  1. 按制表符拆分每条记录 -F"\t"
  2. 设置变量q单引号:-v q="'"
  3. 打印出起始括号'{printf "("}
  4. 从第 2 列开始遍历记录中的每一列 for (i=2;i<=NF;i++)
  5. 打印列,然后用单引号将列括起来(使用变量):printf "%s\t", q $i q
  6. 最后打印出文字 @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/

相关文章:

shell - 为什么 mktime 在 Awk 中返回 -1?

linux - 仅当使用 sed 或 awk 为空时才删除模式后的一行

sql - Oracle PL SQL Procedure 需要修改以接受具有所有类型字符的数组并拆分

javascript - 模式匹配

java - 在 Java 中,如何对标记中包含分隔符的字符串进行标记?

linux - 从当前目录到另一个目录的 scp 批量文件

json - 创建列表键对象 shell Linux

c++ - 非阻塞套接字上的挂起程序

LINUX:如何输出 SQL 脚本中使用的表

javascript - 使用正则表达式或其他方式替换字符串中的数字