从文本文件中读入搜索字符串,在第二个文本文件中搜索字符串并输出到CSV

时间:2015-07-24 13:55:08

标签: csv awk scripting

我有一个名为file1.txt的文本文件,其格式如下:

001 , ID , 20000
002 , Name , Brandon
003 , Phone_Number , 616-234-1999
004 , SSNumber , 234-23-234
005 , Model , Toyota
007 , Engine ,V8
008 , GPS , OFF

我的file2.txt格式如下:

#==============================================
# 005 : Model
#------------------------------------------------------------------------------
[Model] = Honda
option = 0
length = 232
time = 1000
hp = 75.0
k1 = 0.3
k2 = 0.0
k1 = 0.3
k2 = 0.0
#------------------------------------------------------------------------------
[Model] = Toyota
option = 1
length = 223
time = 5000
speed = 50
CCNA = 1
#--------------------------------------------------------------------------
[Model] = Miata
option = 2
CCNA = 1
#==============================================
# 007 : Engine
#------------------------------------------------------------------------------
[Engine_Type] = V8                 #1200HP
option = 0
p = 12.0
pp = 12.0
map = 0.4914
k1mat = 100
k2mat = 600
value =12.00
mep = 79.0
cylinders = 8
#------------------------------------------------------------------------------
[Engine_Type] = v6                 #800HP
option = 1
active = 1
cylinders = 6
lim = 500
lim = 340
rpm = 330
start = 350
ul = 190.0
ll = 180.0
ul = 185.0
#==============================================
# 008 : GPS
#------------------------------------------------------------------------------
[GPS] = ON
monitor = 0
#------------------------------------------------------------------------------
[GPS] = OFF
monitor = 1
Enable = 1
#------------------------------------------------------------------------------
[GPS] = Only
monitor = 2
Enable = 1
#==============================================
# 014 :Option
#------------------------------------------------------------------------------
[Option] = Disable
monitor = 0
#------------------------------------------------------------------------------
[Option] = Enable
monitor = 1
#==============================================
# 015 : Weight
#------------------------------------------------------------------------------
[lbs] = &1
weight = &1
#==============================================

预期输出应该如下所示: 由于file1.txt中只有选项005-008,因此输出为:

Code:
#==============================================
# 005 : Model
#------------------------------------------------------------------------------
[Model] = Toyota
option = 1
length = 223
time = 5000
speed = 50
CCNA = 1
#==============================================
# 007 : Engine
#------------------------------------------------------------------------------
[Engine_Type] = V8                 #1200HP
option = 0
p = 12.0
pp = 12.0
map = 0.4914
k1mat = 100
k2mat = 600
value =12.00
mep = 79.0
cylinders = 8
#==============================================
# 008 : GPS
#------------------------------------------------------------------------------
[GPS] = OFF
monitor = 1
Enable = 1
#-----------------------------------------------------------------

现在,使用awk和file1中第2和第3列的值,我想在file2中搜索这些字符串,并将该部分中的所有内容输出到CSV文件,即从找到字符串的位置到有文件的位置#------------- 划界。

有人可以帮我解释一下并解释一下吗?我是Awk的新手

谢谢!

1 个答案:

答案 0 :(得分:0)

我不会按照规定使用awk来完成这项工作,但这里有一小段内容可以开始:

awk -F'[ ,]+' 'FNR == NR { section["[" $2 "]"] = $3; next }
               /^\[/ && section[$1] == $3, /^#/' file1.txt file2.txt

1)-F'[ ,]+'将字段分隔符设置为空格和/或逗号中的一个或多个(因为file1.txt看起来不是正确的CSV文件)。

2)FNR == NR(文件中的记录数等于总记录数)仅在读取file1.txt时才为真。因此,对于file1.txt中的每一行,我们将[second_field]记录为要查找的模式,并将第三个字段作为值。

3)然后我们查找以[开头的行,其中section中存储的该行的第一个字段的值与该行的第三个字段匹配(/^\[/ && section[$1] == $3 ),并从该行打印,直到以#开头的下一行。

示例输入的输出为:

[Model] = Toyota
option = 1
length = 223
time = 5000
speed = 50
CCNA = 1
#--------------------------------------------------------------------------
[GPS] = OFF
monitor = 1
Enable = 1
#------------------------------------------------------------------------------

第3步中的匹配行为[Model] = Toyota[GPS] = OFF。缺少Engine行,因为file2.txt代替Engine_Type。另外,我没有打扰部分标题;添加另一个条件来打印它们很容易,但它需要先行才能打印出那些内容匹配的内容(因为当你读到标题时你不知道是否在里面找到匹配)。为此,我会切换到另一种语言(例如Ruby)。