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

从文本文件中读取搜索字符串,在第二个文本文件中搜索字符串并输出到CSV,csv,awk,scripting,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 #============================================== # 005 : Model #----

我有一个名为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
#==============================================
# 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
#==============================================
我的file2.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
#==============================================
# 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的新手


谢谢大家!

我不会像指定的那样将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\u field]
记录为要查找的模式,第三个字段作为值

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

示例输入的输出为:

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

步骤3中的匹配行为
[Model]=Toyota
[GPS]=关闭
引擎
行丢失,因为
文件2.txt
改为
引擎类型
。此外,我不必担心节标题;可以很容易地添加另一个条件来打印它们,但它需要前瞻性地只打印其中将包含匹配内容的部分(因为当你阅读标题时,你不知道里面是否有匹配项)。为此,我会切换到另一种语言(如Ruby)。

我不会按照规定使用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\u field]
记录为要查找的模式,第三个字段作为值

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

示例输入的输出为:

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

步骤3中的匹配行为
[Model]=Toyota
[GPS]=关闭
引擎
行丢失,因为
文件2.txt
改为
引擎类型
。此外,我不必担心节标题;可以很容易地添加另一个条件来打印它们,但它需要前瞻性地只打印其中将包含匹配内容的部分(因为当你阅读标题时,你不知道里面是否有匹配的内容)。为此,我会切换到另一种语言(例如Ruby).

谢谢你的帮助和解释。我将开始这方面的工作,如果遇到问题,我会问更多的问题。此外,如果我想将其作为一个可以从命令行运行的自包含脚本来编写,我该如何做呢?@user2056389将其放入一个文件中,使其可执行,第一行:
#!/usr/bin/env awk-f
谢谢你的帮助和解释。我将开始这方面的工作,如果我遇到问题,我会问更多的问题。另外,如果我想把它写成一个可以从命令行运行的自包含脚本,我该怎么做呢?@user2056389将它放在一个文件中,使其可执行,第一行:
!/usr/bin/env awk-f