2017-01-07 25 views
0

我有它的一些數據,看起來像這樣大的文本文件:

$ 10c20 
data 
data 
. 
. 
data 
data 
$ 10c21 
data 
data 
. 
. 
data 
data 
$ 10c22 
. 
. 

我想提取開始每兩個註釋行之間的數據(與「$」)並將該塊數據存儲在一個新文件中,然後將下一個塊存儲到文件結尾。我嘗試過「sed」,但我無法獲得我需要的東西。任何想法?

所需的輸出:

$ 10c20 
    data 
    data 
    . 
    . 
    data 
    data 

$ 10c21 
    data 
    data 
    . 
    . 
    data 
    data 

$ 10c22 
    data 
    data 
    . 
    . 
    data 
    data 

和...

+0

很難/不可能在多行操作中使用sed。最多連續兩行是我「輕鬆」設法工作的。任何語言都有可能嗎? – kabanus

+1

請將您希望的輸出樣本輸入添加到您的問題中。 – Cyrus

+0

@kabanus我已經做了類似的事情,只有兩行不同的模式,但我不知道如何做到這一點 – gnome

回答

1

如果你不希望像一個 '高' 的語言Python/Perl有一個共同的內置csplit,但你需要同意文件的工作:

/home/.../RGS/tmp>csplit bla '/^\$/' {*} 
0 
21 
21 
21 
21 
/home/.../RGS/tmp>cat xx00 
/home/.../RGS/tmp>cat xx01 
$ 10c20 
data1 
data1 
/home/.../RGS/tmp>cat xx02 
$ 10c21 
data2 
data2 
/home/.../RGS/tmp>cat xx03 
$ 10c22 
data3 
data3 
/home/.../RGS/tmp>cat xx04 
$ 10c23 
data4 
data4 
/home/.../RGS/tmp> 

其中BLA是:

$ 10c20 
data1 
data1 
$ 10c21 
data2 
data2 
$ 10c22 
data3 
data3 
$ 10c23 
data4 
data4 

,並在剛剛結束rm xx*

編輯

一旦文件已經準備好,在bash剛:

for inp in xx*; do 
    cat $inp | toSomeComputations & 
    #Or 
    toSomeComputations $inp & 
done 
當然

,你可以用別的東西來使這個循環並行。

+0

我認爲你不明白我想要什麼,兩條註釋行之間的數據是可變的和巨大的,不能使用你的碼。無論如何感謝 – gnome

+0

這適用於'可變和巨大'的數據,但也許你應該考慮使用一種簡單的語言腳本。如果你不清楚如何處理分割後的文件,我會編輯。 – kabanus

+0

它是一個大規模並行計算程序,所以它沒有幫助,我只是想將提取的塊粘貼到另一個文件中作爲輸入提到的程序。 – gnome

0

這是一個GNU awk腳本,它重現了@kabanus的答案。當@kabanus給出的答案不適合你時,我不知道這是如何幫助你的,但是在這裏。

script.awk

function doit(header) { 
    # filename with leading zeros in number 
    outFileName = sprintf("out_%04d", NR-1) 
    printf("%s%s", header, $0) > outFileName 
    # now lets run a command on that file, e.g. cat 
    system("cat " outFileName) 
} 

# set record split by the dollar lines 
BEGIN { RS="[$][^\n]+" } 

{ 
    # on NR == 1 (the first record) oldRT is empty 
    # we need to store RT and use oldRT when we output $0 
    # for the next record 
    if(oldRT) doit(oldRT) 
    oldRT = RT 
} 

運行這樣的:awk -f script.awk yourfile

+0

如何打印出每個提取的數據塊來分隔文件? (考慮循環) – gnome

+0

@ Lars-Fisher ??? – gnome

+0

現在請離開鍵盤。 –

0

所有你需要的是:

awk ' 
function doCalculation() { 
    # do whatever you want with the multi-line string "buf" then 
    printf "%s", buf 
    buf = "" 
} 
/^\$/ { doCalculation() } 
{ buf = buf $0 ORS } 
END { doCalculation() } 
' file 

您可以BUF一個數組,而不是多行字符串,如果這更方便,但邏輯相同的方式。