如何使用 Bash 从文件中的字符串匹配文本中提取记录

如何使用 Bash 从文件中的字符串匹配文本中提取记录

我有一个文本文件sample.txt

=====record1
title:javabook
price:$120
author:john
path:d:
=====record2
title:.netbook
author:paul
path:f:
=====record3
author:john
title:phpbook
subject:php
path:f:
price:$150
=====record4
title:phpbook
subject:php
path:f:
price:$150

从此我想根据作者拆分数据。它应该分成两个文件,其中包含:

test1.txt

=====record1
    title:javabook
    price:$120
    author:john
    path:d:
=====record3
    author:john
    title:phpbook
    subject:php
    path:f:
    price:$150

test2.txt

=====record2
    title:.netbook
    author:paul
    path:f:

我想sample.txt根据作者字段动态地将主文件分类为子文件。

答案1

使用awk将字段存储在变量中。当达到记录标记时,将字段写入相应的文件(使用作者名称)。

-F:指定字段以“:”分隔

此行$1 ~ /author/ { author=$2 }如果行的第一个字段是“author”,则将值存储在 author 变量中。这是必需的,因为必须有一个以 author 命名的文件来写入记录。

使用substr()提取前五个字符,如果找到记录标记“=====”的开头,则将数据(存储在变量中rec)写入相应的作者文件。

 awk -F: '
    $1 ~ /author/ { author=$2; }
    {
        if (substr($1,0,5) == "=====" && author != "") {
            print rec >> (author".txt")
            rec=$0; author=""
        }
        else
            rec=rec "\n" $0
    }
    END { if (author != "") print rec >> (author".txt") }
    ' authors.txt

相关内容