Вывод головы до определенной строки
У меня есть куча файлов в следующем формате.
A.txt:
some text1
more text2
XXX
more text
....
XXX
.
.
XXX
still more text
text again
Каждый файл имеет как минимум 3 строки, начинающиеся с 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 без особой причины.
2 ответа
Более простой метод будет использовать 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
head -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