2013-02-10 37 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