Выборка из файла

Тема в разделе "Операционные системы", создана пользователем Sliva, 19 ноя 2006.

Статус темы:
Закрыта.
  1. Sliva

    Sliva Гость

    И снова файлы :) помогите, пожалуйста!
    Команды head и tail делают горизонтальные выборки из файла. Написать командный файл, который будет обеспечивать вертикальные выборки. Интерфейс такой:
    colls n1 n2 имя_файла
    В стандартный выходной файл должны выводится символы файла имя_файла, начиная с позиции n1 и заканчивая позицией n2. Если параметр n2 не задан, то выводятся позиции, начиная с n1 и до конца строки.
     
  2. zugr

    zugr Гость

    1. См.команду gawk
    substr(s, i [, n])

    возвращает n-символьную подстроку строки s, начиная с i. Если n не указано, то возвращается остаток строки s. ​
    2. См. команду sed

    (2)s/регулярное_выражение/замена/флаги
    Подставить замену вместо фрагментов буфера, отождествленных с регулярным_выражением. Вместо / можно использовать любой символ. Детали см. в ed(1).
    Флаги могут быть опущены или иметь следующие значения: ​
    g Заменить все вхождения регулярного_выражения, а не только первое.

    p Если замена произошла, вывести содержимое буфера.

    w з_файл Если замена произошла, добавить содержимое буфера к з_файлу.

    3. Можно на bash вконце концов реализовать (См. Подстановка значений параметров, Подстановка подстрок.)
     
  3. Sliva

    Sliva Гость

    :unsure: Мне и надо на bash :blink:
     
  4. zugr

    zugr Гость

    Код (Text):
    #! /bin/bash

    declare -i startpos="$1"
    shift
    declare -i len="$1"
    shift

    cat $1 | while read a; do
    if (( len != 0 )); then
    echo "${a:$startpos:$len}"
    else
    echo "${a:$startpos}"
    fi 
    done
    if (( len != 0 )); then
    echo "${a:$startpos:$len}"
    else
    echo "${a:$startpos}"
    fi
    Код (Text):
    $ bash ./a.sh 4 0 ./a.sh
    bin/bash

    are -i startpos="$1"
    t
    are -i len="$1"
    t

    $1 | while read a; do
    ( len != 0 )); then
    "${a:$startpos:$len}"

    "${a:$startpos}"


    ( len != 0 )); then
    "${a:$startpos:$len}"

    "${a:$startpos}"


    $ bash ./a.sh 4 3 ./a.sh
    bin

    are
    t
    are
    t

    $1
    ( l
    "$

    "$


    ( l
    "$

    "$


    $

    Слегка надо подкоректировать:
    Правильнее писать
    Код (Text):
    ...
    cat "$@" | while read -r a; do
    ...
    А то если в имени файла есть пробелы, будут ошибки.
     
  5. Sliva

    Sliva Гость

    :) Благодарю! А я начала писать так:
    Код (Text):
    #!/bin/bash
    echo "Введите n1:"
    read n1
    echo "Хотите ввести n2? (y/n)"
    read answer
    if [[ $answer="y" ]] then
    echo "Введите n2:"
    read n2
    fi
    while read do
    ...
    done
    А что в цикле писать не пойму.
    Чтобы выполнить - нужно предварительно файл создать? Или можно открыть из имеющихся? Извините за глупые вопросы :(
     
  6. zugr

    zugr Гость

    1. Зачем задавать вопросы если уже в первом вопросе был оговорён формат:
    Код (Text):
    colls n1 n2 имя_файла
    2. В цикле просто выводится строки полученные командой read,
    Код (Text):
    echo
    но не полностью, а только с указаной позиции, и только указанное количество
    Код (Text):
    echo "${a:$startpos:$len}"
    и если колическво равно 0,
    Код (Text):
    if (( len != 0 )); then
    то просто до конца строки.
    Код (Text):
    echo "${a:$startpos}"
    Файл создавать не нужно. Это породит массу дополнительных вопросов:
    -- где (в каком каталоге) создать дополнительный файл;
    -- какое имя выбрать для дополнительного файла;
    -- неповредитли информацию во временном файле паралельные задания других пользователей;
    -- как удалять файл в случае непредвиденного останова;
    и т.д.

    По этому пусть файл(или несколько файлов) читает команда
    Код (Text):
    cat "$@"
    и передаёт его через конвеер (символ "|" перед while) циклу, который и будет его считывать через read
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей