【发布时间】:2013-08-30 12:48:56
【问题描述】:
我有两个文件,我想将 file1 分成等于 file2 中的行数的部分。
此处将 file2 中的每一行与 file1 进行比较,并将 file1 中的所有匹配记录形成为新文件。
文件1
<AUDIT_RECORD TIMESTAMP="2013-08-26T19:31:17" NAME="Query" CONNECTION_ID="21974096" STATUS="0" SQLTEXT="SHOW COLLATION"/>
<AUDIT_RECORD TIMESTAMP="2013-08-26T19:31:17" NAME="Query" CONNECTION_ID="21974099" STATUS="0" SQLTEXT="SHOW TABLES"/>
<AUDIT_RECORD TIMESTAMP="2013-08-26T19:31:17" NAME="Query" CONNECTION_ID="21974095" STATUS="0" SQLTEXT="SHOW COLLATION"/>
<AUDIT_RECORD TIMESTAMP="2013-08-26T19:31:17" NAME="Query" CONNECTION_ID="21974094" STATUS="0" SQLTEXT="SHOW COLLATION"/>
<AUDIT_RECORD TIMESTAMP="2013-08-26T19:31:17" NAME="Query" CONNECTION_ID="21974099" STATUS="0" SQLTEXT="SHOW COLLATION"/>
<AUDIT_RECORD TIMESTAMP="2013-08-26T19:31:17" NAME="Query" CONNECTION_ID="21974094" STATUS="0" SQLTEXT="SET NAMES utf8"/>
文件2
21974096
21974100
21974095
21974094
21974099
需要的输出:
21974094.txt
==========================================
TIMESTAMP="2013-08-26T19:31:17"
SQLTEXT="SET NAMES utf8"
==========================================
TIMESTAMP="2013-08-26T19:31:17"
SQLTEXT="SHOW COLLATION"
21974099.txt
==========================================
TIMESTAMP="2013-08-26T19:31:17"
SQLTEXT="SHOW COLLATION"
==========================================
TIMESTAMP="2013-08-26T19:31:17"
SQLTEXT="SHOW TABLES"
21974095.txt
==========================================
TIMESTAMP="2013-08-26T19:31:17"
SQLTEXT="SHOW COLLATION"
...
为了使用 awk 实现这一点,我编写了如下代码,但它不能满足我的要求。
awk 'NR==FNR{a[$4];next}!($4 in a){ print $2 "\n" $6 "\n=========\n" > $4 ".txt"}' file2 file1
任何人都可以帮助我如何使用 awk 或任何其他 shell 命令来实现上述要求。 (它必须至少生成 10000 个文件,并且应该在最多 10 分钟内完成生成文件。)
第一次尝试
如果我执行了下面的命令,它几乎可以达到但不完全满足要求。
awk 'NR==FNR{a[$1];next}{split($4,b,"\"")}(b[2] in a){print $2"\n"$10"\n=========\n" > b[2]".txt"}' file2 file1
其中一个文件的输出
TIMESTAMP="2013-08-26T19:57:34"
SQLTEXT="/*
=========
TIMESTAMP="2013-08-26T19:57:34"
SQLTEXT="/*
=========
TIMESTAMP="2013-08-26T19:57:34"
SQLTEXT="SHOW
但我想要如下所示的输出
TIMESTAMP="2013-08-26T19:57:34"
SQLTEXT="/*show variables"
=========
TIMESTAMP="2013-08-26T19:57:34"
SQLTEXT="/* select * from table "
=========
TIMESTAMP="2013-08-26T19:57:34"
SQLTEXT="SHOW collations "
这里的意思是我需要将文件 1 的分隔符指定为 '"' 而文件 2 没有分隔符..
有人可以帮忙吗?
【问题讨论】:
-
你可以使用 GNU 版本的 awk 吗?
-
如果file2中的数字在file1中不存在,你想怎么办?
-
数字总是存在的......因为从file1中提取的数字是通过一些过滤得到的。
-
这个过程是运行一次,还是必须定期运行?
-
这是要保存在 cron 中的东西