【问题标题】:Read in search strings from text file, search for string in second text file and output to CSV从文本文件中读取搜索字符串,在第二个文本文件中搜索字符串并输出到 CSV
【发布时间】:2015-10-15 05:40:43
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: csv awk scripting


    【解决方案1】:

    我不会真正按照规定使用 awk 来完成这项工作,但这里有一个小 sn-p 开始:

    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] = OFFEngine 行丢失,因为 file2.txtEngine_Type 代替。另外,我不关心章节标题;添加另一个条件来打印它们很容易,但它需要先行打印只有那些将在其中包含匹配内容的条件(因为在您阅读标题时,您不知道是否在里面找到匹配项)。为此,我会切换到另一种语言(例如 Ruby)。

    【讨论】:

    • 感谢您的帮助和解释。如果我遇到困难,我将着手解决这个问题并提出进一步的问题。
    • 另外,如果我想把它写成一个可以从命令行运行的自包含脚本,我该怎么做呢?
    • @user2056389 把它放在一个文件中,使其可执行,第一行:#!/usr/bin/env awk -f
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多