我有一个文本文件 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
从此我想根据作者拆分数据,它应该分成 2 个文件,其中包含
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
#!/bin/bash
tr '\n' ' ' < sample.txt | sed 's:=====:\n=====:g' | sed 's: *$::g' >tmp1
grep "author:john" tmp1 | sed 's: :\n\t:g' > test1.txt
grep "author:paul" tmp1 | sed 's: :\n\t:g' > test2.txt
rm tmp1
“tr”命令将每个换行符替换为空格(整个文件现在为 1 行),
这将通过管道传输到“sed”,这将导致每个“=====”都从新行开始。第二个“sed”将删除尾随空格。所有这些都发送到临时文件中。现在每行有 1 个“记录”。
第一个“grep”将从临时文件中读取并输出所有“author”为“john”的记录,这些记录通过管道传输到“sed”,它将每个空格替换为换行符后跟制表符(以准确重现 OP 的布局)并将其发送到名为 test1.txt 的文件
第二个 grep 同上,即“paul”和“test2.txt”
最后一步是删除不再需要的临时文件,