2013-02-10 59 views
2

我有一堆以下格式的文件。頭部輸出到特定線路

A.TXT

some text1  
more text2  
XXX 
more text 
.... 
XXX 
. 
. 
XXX 
still more text 
text again 

每個文件具有至少3個與XXX開始行。現在,對於每個文件A.txt,我希望將所有行寫入到文件A_modified.txt的第3次出現XXX(在上例中,直到still more text之前的行)。

我想在bash中做到這一點,並想出了grep -n -m 3 -w "^XXX$" * | cut -d: -f2以獲得每個文件中的相應行號。

是否可以使用head以及這些行號來生成所需的輸出? PS:我知道一個簡單的python腳本可以完成這項工作,但我正在嘗試在這個bash中做任何具體原因。

回答

3

的第一「N」線A更簡單的方法將是使用awk。假設沒有什麼,但在你的當前工作目錄感興趣的文件,請嘗試:

for i in *; do awk '/^XXX$/ { c++ } c<=3' "$i" > "$i.modified"; done 

或者,如果你的文件是非常大的:

for i in *; do awk '/^XXX$/ { c++ } c>=3 { exit }1' "$i" > "$i.modified"; done 
+0

謝謝,它工作:) – Graddy 2013-02-10 02:43:02

2

頭-n將打印出的文件

#!/bin/sh 

for f in `ls *.txt`; do 
    echo "searching $f" 

    line_number=`grep -n -m 3 -w "^XXX$" $f | cut -d: -f1 | tail -1` 

    # line_number now stores the line of the 3rd XXX 

    # now dump out the first 'line_number' of lines from this file 
    head -n $line_number $f 
done 
+1

感謝的瑣事,但也無濟於事。 – 2013-02-10 01:43:21

+0

是的...但是n的值對於不同的文件是不同的。我的問題是如何爲目錄中的所有文件執行此操作。 – Graddy 2013-02-10 01:44:07

+0

Graddy:一個'for'循環? – 2013-02-10 01:45:22