2012-07-18 76 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