LINUX.ORG.RU

Скрипт для пакетной обработки текстовых файлов

 ,


0

2

Доброго времени суток.
Ранее я уже спрашивал как выровнять текст по левой стороне чередуя запятыми каждый символ. Увы, та тема уже в архиве. Сейчас снова появилась потребность в этом, только теперь длина наидлиннейшей строки в каждом файле разная и её нужно высчитывать отдельно для каждого. Спасибо анонимусу, который в конце предложил такую комманду (и она также работала на равне с другими решениями). А вот сейчас, пробую, а она что-то не работает (просто копирует файл и всё). Приведу её здесь:

awk -v x=$(awk 'm<NF {m=NF} END {print m}' input.txt) '{n=x-NF; gsub("[[:space:]]+", ","); s=""; for (i=0; i<n; i++) {s=s","}; print s$0}' input.txt > output.txt

Что-то изменилось в интерпретаторе?

Ну не твое это... Мети дворы.

anonymous
()

Ну нате на bash, с однократным чтением входного файла, со стандартного ввода, длинна слов не важна:

#!/usr/bin/env bash

declare -a file line
declare -i lines line_number words max_words word pass
f_old=$- ; set -f

readarray -t file
lines=${#file[@]}
for((pass=0; pass<2; pass++)); do
  for((line_number=0; line_number<lines; line_number++)); do
        line=( ${file[line_number]} )
        words=${#line[@]}
        if [[ pass -eq 0 ]]; then
          if [[ max_words -lt words ]]; then
                max_words=words
                commas=${line[@]/*/,}
                commas=${commas// /}
          fi
        else
          for((word=0; word<words; word++)); do
                echo -n ${commas::word==0?max_words-words:1}"${line[word]}"
          done
          echo
        fi
  done
done
[[ $f_old != *f* ]] && set +f

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

Что-то и ваш скрипт не работает - ничего не происходит при его запуске.

Запускаете как script.sh < input.txt надеюсь?

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

Опс!
Извините, я опечатался в первом сообщении. Получить нужно просто выравнивание строк по правому краю путём добавления в начало необходимого количества пробелов.
Вот, нашёл даже страничку делающую то, что надо в онлайне.

sspphheerraa
() автор топика
Ответ на: комментарий от sspphheerraa

Получить нужно просто выравнивание строк по правому краю

И зачем это для calc?

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

нашёл даже страничку

не открывается, вероятно заблочено тут

в табличные процессоры можно импортировать CSV, не знаю как тебе это, конечно, поможет, но вдруг

anonymous
()
8 июля 2019 г.
Ответ на: комментарий от anonymous

Спасибо всем отписавшимся. Я составляю словарь орфографии для hunspell. Выравнивание по концовке строки нужно было для импортирования в Calc-ку (одна буква - одна ячейка), чтобы можно было анализировать буквенные изменения в окончаниях при склонении слов. С csv я и работаю (вернее комбинирую, обработку csv в обычном текстовом редакторе и в LibreOffice Calc). Сейчас этот этап пройден. В итоге я имею файл аффиксов и файл инфинитивов (с флагами). Однако, из-за «издержек производства» в словаре проскакивают дубли, но с разными флагами. Например.

автоинспектор/1,5,15,20,25
автоинспектор/1,5,15,20,29
адрес/1,5,15,20,25
адрес/1,5,15,20,29
амбарище/1,5,15,25
амбарище/1,5,15,27
...

Нужно убрать дубли «сложив» флаги. Т.е. привести к следующему
автоинспектор/1,5,15,20,25,29
адрес/1,5,15,20,25,29
амбарище/1,5,15,25,27
...

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