LINUX.ORG.RU

Как работать с текстовыми файлами с помощью скрипта sh (Linux)?

 , , , ,


2

2

Здравствуйте, помогите решить такую задачу: Нужно посчитать, сколько последних подряд идущих строк файла, имя которого передано в качестве первого параметра командной строки, начинается с «#». Буду признателен за любую помощь (ссылки на документацию, команды, примерно такие же программы и т.д.)


ну а если на bash нужно, то читать файл можно так:

#!/bin/bash
exec 6<"$1"
while read line <&6; do
    echo "$line" # Вывод строки из файла
done
exec 6<&-
Ну а как модифицировать этот образец под вашу задачу, смотрите в указанном выше руководстве.

vinvlad ★★
()

Какого размера файлы?

Если короткие, то так, например:

#!/usr/bin/env python

import sys

if __name__ == "__main__":
  with open(sys.argv[1]) as fp:
    lines = fp.readlines()

  cnt = 0

  while lines:
    l = lines.pop()
    if l.startswith("#"):
      cnt += 1
      continue
    break

  print(cnt)


Если в конце файлов больше одного переноса строки или если файлы очень большие, то нужно будет поправить.

https://docs.python.org/2/library/functions.html

WitcherGeralt ★★
()
Последнее исправление: WitcherGeralt (всего исправлений: 2)
Ответ на: комментарий от dexpl

Ну, тогде как-то так:

cut -c1 file.txt | uniq -c | grep '#' | tail -1

beastie ★★★★★
()
Ответ на: комментарий от WitcherGeralt

Не знаю, где тебя порвало. Базовый формат там очень простой:

regexp action

Очень выразительный, простой и ёмкий язык обработки текстовых данных.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от beastie

Базовый формат там очень простой:
regexp action

Блин, действительно, спасибо. Я, когда это видел, всегда думал «ну его нахрен», никогда не пытался разобраться. Для понимания хватило двух слов.

WitcherGeralt ★★
()
Ответ на: комментарий от beastie

Однако, ошибочка в awk-шке ) А вдруг # вообще нет или за последним блоком несколько строк без #?
Надо:

BEGIN { count = 0; last = 0 }
/^#/  { count++ }
!/^#/ && count > 0 { last = count; count = 0 }
END   { print count ? count : last }

vinvlad ★★
()
Ответ на: комментарий от dexpl

Досадно узнать, что многие годы для обработки текста я писал бестолковые десятки строк на питоне или страшенные костыли на баше, когда под рукой всегда был awk, а я просто не смотрел в его сторону.

WitcherGeralt ★★
()

perl -nE '/^#/ ? ++$n : ($n = 0) }{ say $n'

Jini ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.