2013-02-10 3 views
2

У меня есть куча файлов в следующем формате.головной выход до определенной строки

a.txt:

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

Каждый файл имеет по крайней мере три строки, начинающиеся с XXX. Теперь для каждого файла A.txt Я хочу написать все строки до 3-го вхождения XXX (в приведенном выше примере это до строки до still more text) в файл A_modified.txt.

Я хочу сделать это в bash и придумал grep -n -m 3 -w "^XXX$" * | cut -d: -f2, чтобы получить соответствующий номер строки в каждом файле.

Можно ли использовать head вместе с этими номерами строк для генерации требуемого выхода?

PS: Я знаю, что простой скрипт python выполнит эту работу, но я пытаюсь сделать это в bash без какой-либо конкретной причины.

ответ

3

Более простой метод должен был бы использовать 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

2

головка -n печатает первые «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

спасибо за пустяков, но это не поможет. –

+0

Да ... но значение n отличается для разных файлов. Мой вопрос заключается в том, как сделать это для всех файлов в каталоге. – Graddy

+0

Graddy: цикл 'for'? –

Смежные вопросы