2012-07-18 81 views
1

我是Unix工具新手,但尝试学习新的东西,并尝试将我的简单ruby脚本切换到某种类型的shell脚本,做同样的事情。但我不知道如何处理这个任务。使用Unix工具分割文本文件,如grep和sed

我需要拆分一个包含几个小对象的大文件。每个对象都从以下行开始:OBJECT Type Number Name

当我使用Ruby时,如果我找到了模式,我会逐一走文件行,然后开始将行转储到文件中。直到我再次找到这种模式。

完成后,我会收到一堆较小的文件,而不是一个大的文件。

但是有可能使用shell脚本和Unix实用程序来做同样的事情吗? grepsed ...不需要致电perlruby

编辑:我试图开发自定义git命令和使用Windows。所以只有msysgit附带的实用程序可用于我。

创建的对象的文件名的模式如下Type-Number.txt

UPDATE:感谢@perreal我拿出下面的代码,它做我想做的。并希望其他Dynmaics NAV开发者使用Git开发会发现这个git object splitter有用:

#!/bin/sh 
# 
# Splits text file with multiple Dynamics NAV object into many files, one per object. 
# If no input file name is given, default name (all.txt) will be used instead. 
# 

if [ -n "$1" ] 
then 
    ALL="$1" 
else 
    ALL="all.txt" 
fi 

awk '{ 
    if (/^(OBJECT).*/) { 
     file = toupper(substr($2,1,3))$3".TXT" 
     print > file 
    } else { 
     print >> file 
    } 
}' "$ALL" 
+0

是AWK-基础的解决方案是否可以接受?你想要什么形式的输出文件名? – igustin 2012-07-18 15:17:34

+3

'csplit'(context split)可以做你需要的。 – 2012-07-18 15:17:43

+0

@igustin,是的awk是好的。 – shytikov 2012-07-18 15:18:41

回答

4
awk '{ 
    if (/(OBJECT.*)/) { 
    file = OBJECT$2$3$4 
    print > file 
    } else { 
    print >> file 
    } 
}' input_file 
+0

我明白了,谢谢!让我在接受答案之前测试这种方法。 – shytikov 2012-07-18 17:16:19

+0

工作有点不正确,因为'标题行'没有传递到输出文件。但这是简单的... – shytikov 2012-07-19 09:27:58

2

我认为你正在寻找一个 '上下文拆分' 命令:csplit可

$ csplit filename '/OBJECT/' 
+1

您的意思是' csplit文件名/ OBJECT /'但是,你有'csplit'的正确想法。 – 2012-07-18 15:23:26

+0

感谢您的更正。 – hipe 2012-07-18 15:29:41

+0

不幸的是'csplit'不附带msysgit。 – shytikov 2012-07-18 15:53:29