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


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

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

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

adawdp

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

— Существуют файлы вида:
Код: Bash
  1. pg_0001.pdf     pg_0014.pdf
  2. pg_0002.pdf     pg_0013.pdf
  3. pg_0003.pdf     pg_0012.pdf
  4. pg_0004.pdf     pg_0011.pdf
  5. pg_0005.pdf     pg_0010.pdf
  6. pg_0006.pdf     pg_0009.pdf
  7. pg_0007.pdf     pg_0008.pdf
  8. pg_0008.pdf     pg_0007.pdf
  9. pg_0009.pdf     pg_0006.pdf
  10. pg_0010.pdf     pg_0005.pdf
  11. pg_0011.pdf     pg_0004.pdf
  12. pg_0012.pdf     pg_0003.pdf
  13. pg_0013.pdf     pg_0002.pdf
  14. pg_0014.pdf     pg_0001.pdf
— Количество строк разное может быть, но всегда чётное, нужно удалить ровно половину строк, в данном случае начиная со строки pg_0008.pdf   pg_0007.pdf
— Как удалять с помощью sed заданное количество строк я знаю, как с помощью ws
посчитать строки тоже знаю.
— Что как-то вводить в переменную количество строк делённое на два и дальше подставлять в sed?
— Я не программист, подскажите пожалуйста путь решения.
« Последнее редактирование: 07 Май 2016, 22:35:37 от adawdp »

Оффлайн sieger1x2

  • Любитель
  • *
  • Сообщений: 78
    • Просмотр профиля
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

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

adawdp

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

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

Оффлайн Azure

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

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Можно и с помощью sed в 1 строчку
Код: Bash
  1. sep="\r" #символ или комбинация не встречающиеся в именах,
  2. #+кроме метасимволов RE (*, +, {, [, … )
  3. printf "%s$sep" pg_*.pdf | #получаем список файлов разделенных $sep
  4.     sed -r "
  5.        /\n/! {
  6.            s/$sep/\n/
  7.            s/(\n.*$sep)(.+)$sep/\n\2\1/
  8.            }
  9.        P
  10.        D
  11.    "
« Последнее редактирование: 09 Май 2016, 17:17:28 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

adawdp

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

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

 

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