Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Как в текстовом файле удалить ровно половину строк?  (Прочитано 1067 раз)

0 Пользователей и 1 Гость просматривают эту тему.

adawdp

  • Автор темы
  • Гость
2016 May 07; 03:32 PM; Oakville, ON, Canada.

— Существуют файлы вида:
Код: (bash) [Выделить]
pg_0001.pdf pg_0014.pdf
pg_0002.pdf pg_0013.pdf
pg_0003.pdf pg_0012.pdf
pg_0004.pdf pg_0011.pdf
pg_0005.pdf pg_0010.pdf
pg_0006.pdf pg_0009.pdf
pg_0007.pdf pg_0008.pdf
pg_0008.pdf pg_0007.pdf
pg_0009.pdf pg_0006.pdf
pg_0010.pdf pg_0005.pdf
pg_0011.pdf pg_0004.pdf
pg_0012.pdf pg_0003.pdf
pg_0013.pdf pg_0002.pdf
pg_0014.pdf pg_0001.pdf
— Количество строк разное может быть, но всегда чётное, нужно удалить ровно половину строк, в данном случае начиная со строки pg_0008.pdf   pg_0007.pdf
— Как удалять с помощью sed заданное количество строк я знаю, как с помощью ws
посчитать строки тоже знаю.
— Что как-то вводить в переменную количество строк делённое на два и дальше подставлять в sed?
— Я не программист, подскажите пожалуйста путь решения.
« Последнее редактирование: 07 Мая 2016, 22:35:37 от adawdp »

Оффлайн sieger1x2

  • Любитель
  • *
  • Сообщений: 84
    • Просмотр профиля
DIR='.'; ls $DIR | while read FILE; do lines=`cat "$DIR/$FILE" | wc -l`; echo "$DIR/$FILE"; head -$(($lines/2)) "$DIR/$FILE" >> "$DIR/$FILE""_head"; done

Если один файл, то
FILE="name"; lines=`cat $FILE | wc -l`; head -$(($lines/2)) $FILE >> "$FILE""_head";
« Последнее редактирование: 08 Мая 2016, 02:53:08 от sieger1x2 »

adawdp

  • Автор темы
  • Гость
2016 May 07; 08:04 PM

Sieger1x2, спасибо, мне такой путь решения не виделся даже в принципе :) !
— Всё работает без нареканий!!!

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Код: (bash) [Выделить]
for file in * ; do
    split -n l/1/2 "$file" > "$file.head"
    # mv "$file.head" "$file" #ecли надо изменять исходный файл
done
Если я правильно уловил логику на основании которой Вы планируете разделение то
Код: (bash) [Выделить]
sed -ir 'N;P;/(\S+)\n\s*\1/Q;D' *
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

adawdp

  • Автор темы
  • Гость
2016 May 08; 08:27 AM; Oakville, ON, Canada.

А Вам, Azure, отдельное всегда спасибо! Да и этот вариант тоже работает!
— Истоки проблемы:
(Нажмите, чтобы показать/скрыть)

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Код: (bash) [Выделить]
i=0
f=( pg_*.pdf )
lim=$((${#f[@]}/2))
while [ $lim -gt $i ]; do
    printf '%s\n'  "${f[i]}" "${f[-((++i))]}"
done
« Последнее редактирование: 08 Мая 2016, 18:35:00 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Можно и с помощью sed в 1 строчку
Код: (bash) [Выделить]
sep="\r" #символ или комбинация не встречающиеся в именах,
#+кроме метасимволов RE (*, +, {, [, … )
printf "%s$sep" pg_*.pdf | #получаем список файлов разделенных $sep
    sed -r "
        /\n/! {
            s/$sep/\n/
            s/(\n.*$sep)(.+)$sep/\n\2\1/
            }
        P
        D
    "
« Последнее редактирование: 09 Мая 2016, 17:17:28 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

adawdp

  • Автор темы
  • Гость
2016 May 09; 08:40 AM; Oakville, ON, Canada.

— Спасибо, Azure, не разбирался ещё, у нас ведь рабочий день… И традиционно понедельник загружен всякими митингами :).
— Вообще-то нужно было наверное тему создавать как что-то вроде:„Обработка отсканированных изображений PDF или особенности использования pdftk для сортировки страниц“.
— Т.е. чтобы была видна задача в целом. Тасовать отсканированные картинки в  программах для  сканирования утомительно и не всегда удобно и pdf страницы документа менять местами  в программах с графическим интерфейсом довольно долго…

 

Страница сгенерирована за 0.041 секунд. Запросов: 25.