{"id":18340129,"url":"https://github.com/f33rni/pycolumnizer","last_synced_at":"2026-03-14T05:05:43.454Z","repository":{"id":217720773,"uuid":"744652603","full_name":"F33RNI/PyColumnizer","owner":"F33RNI","description":"Classic UNIX-style real-time text formatter with unicode and pipe support","archived":false,"fork":false,"pushed_at":"2024-09-10T09:45:32.000Z","size":22,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-11-05T20:27:29.907Z","etag":null,"topics":["classic","column-generation","columnizer","console-application","linux","osx","pipeline","real-time","retro","text","text-formater","text-formatting","txt","unix","windows"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/F33RNI.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2024-01-17T18:30:28.000Z","updated_at":"2024-10-31T23:10:56.000Z","dependencies_parsed_at":"2024-01-18T02:40:12.513Z","dependency_job_id":"58230108-c017-419e-930d-829fdf8d6303","html_url":"https://github.com/F33RNI/PyColumnizer","commit_stats":null,"previous_names":["f33rni/pycolumnizer"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/F33RNI%2FPyColumnizer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/F33RNI%2FPyColumnizer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/F33RNI%2FPyColumnizer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/F33RNI%2FPyColumnizer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/F33RNI","download_url":"https://codeload.github.com/F33RNI/PyColumnizer/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":230986900,"owners_count":18311106,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["classic","column-generation","columnizer","console-application","linux","osx","pipeline","real-time","retro","text","text-formater","text-formatting","txt","unix","windows"],"created_at":"2024-11-05T20:21:06.104Z","updated_at":"2025-12-16T04:28:33.270Z","avatar_url":"https://github.com/F33RNI.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 📃 PyColumnizer\r\n\r\n## Classic UNIX-style real-time text formatter with unicode and pipe support\r\n\r\n\u003e This program allows you to format one / multiple files or piped stream in the format of classic UNIX docs,\r\n\u003e splitting them into columns, adding line numbers, header, etc. Formatting is done line by line in real time\r\n\u003e (i.e., the output of the program can also be piped to another program)\r\n\u003e In fact, this is an improved version of the \"pr\" command with Unicode support\r\n\r\n----------\r\n\r\n## 🏗️ Get started\r\n\r\n### Install using pip\r\n\r\n```shell\r\npip install git+https://github.com/F33RNI/PyColumnizer.git\r\ncolumnizer -h\r\n```\r\n\r\n### Build using PyInstaller\r\n\r\n```shell\r\npip install pyinstaller\r\npyinstaller main.spec\r\n./dist/columnizer -h\r\n```\r\n\r\n### Run as python script\r\n\r\n```shell\r\npython main.py -h\r\n```\r\n\r\n----------\r\n\r\n## 📃 Usage\r\n\r\n```text\r\nusage: columnizer [-h] [-c COLUMNS] [-w WIDTH] [-p PAGE_SIZE] [-t TITLE] [-s SEPARATOR] [-j] [-a] [-d DATE]\r\n                  [--date-format DATE_FORMAT] [--first-line-number FIRST_LINE_NUMBER]\r\n                  [--first-page-number FIRST_PAGE_NUMBER] [--lines-before-header LINES_BEFORE_HEADER]\r\n                  [--lines-after-header LINES_AFTER_HEADER] [--lines-after-page LINES_AFTER_PAGE]\r\n                  [--line-number-placeholder LINE_NUMBER_PLACEHOLDER]\r\n                  [--page-number-placeholder PAGE_NUMBER_PLACEHOLDER] [--no-line-numbers] [--no-page-numbers]\r\n                  [--no-date] [--no-header] [--skip-empty-lines] [--single-page] [-v]\r\n                  [FILE ...]\r\n\r\nclassic UNIX-style real-time text formatter with unicode and pipe support\r\n\r\npositional arguments:\r\n  FILE                  files to read, if empty, stdin is used\r\n\r\noptions:\r\n  -h, --help            show this help message and exit\r\n  -c COLUMNS, --columns COLUMNS\r\n                        Number of columns (default: 2)\r\n  -w WIDTH, --width WIDTH\r\n                        total width of each line (default: 80)\r\n  -p PAGE_SIZE, --page-size PAGE_SIZE\r\n                        total lines per page (including header and lines-after-page) (default: 68)\r\n  -t TITLE, --title TITLE\r\n                        text title\r\n  -s SEPARATOR, --separator SEPARATOR\r\n                        column separator (default: 4 whitespaces)\r\n  -j, --justify         justify each line in each column\r\n  -a, --across          print columns across rather than down\r\n  -d DATE, --date DATE  title date in YYYY-MM-DD:HH:mm format (default: current date)\r\n  --date-format DATE_FORMAT\r\n                        title date format (default: %Y-%m-%d %H:%M)\r\n  --first-line-number FIRST_LINE_NUMBER\r\n                        counter at first line (default: 1)\r\n  --first-page-number FIRST_PAGE_NUMBER\r\n                        counter at first page (default: 1)\r\n  --lines-before-header LINES_BEFORE_HEADER\r\n                        number of empty lines before header (default: 2)\r\n  --lines-after-header LINES_AFTER_HEADER\r\n                        number of empty lines after header (default: 2)\r\n  --lines-after-page LINES_AFTER_PAGE\r\n                        number of empty lines between pages (default: 5)\r\n  --line-number-placeholder LINE_NUMBER_PLACEHOLDER\r\n                        Placeholder for line number (default: \"{line:\u003e5} \")\r\n  --page-number-placeholder PAGE_NUMBER_PLACEHOLDER\r\n                        Placeholder for page number (default: \"Page: {page}\")\r\n  --no-line-numbers     turn off line numbering\r\n  --no-page-numbers     turn off page numbering\r\n  --no-date             turn off date in header\r\n  --no-header           turn off entire header\r\n  --skip-empty-lines    ignore empty lines\r\n  --single-page         turn off page separation\r\n  -v, --version         show program's version number and exit\r\n```\r\n\r\n----------\r\n\r\n## 📝 Examples\r\n\r\n\u003e You can download example text from this repo. See `text.txt` file\r\n\r\n### Basic example (2 columns, custom page size, title)\r\n\r\n```shell\r\ncolumnizer -c 2 -p 30 -t \"Example text\" text.txt \u003e output.txt\r\n```\r\n\r\n\u003e If you want to get output in console instead of a file, remove `\u003e output.txt`\r\n\u003e\r\n\u003e You can specify multiple input files. For that use `text.txt text2.txt path/to/text3.txt` instead of `text.txt`\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003eoutput.txt\u003c/summary\u003e\r\n\r\n```text\r\n\r\n\r\n2024-01-17 12:45                      Example text                       Page: 1\r\n\r\n\r\n    1   Lorem ipsum dolor sit amet,          21   urna condimentum mattis       \r\n    2   consectetur adipiscing elit,         22   pellentesque id. Et malesuada \r\n    3   sed do eiusmod tempor                23   fames ac turpis egestas sed   \r\n    4   incididunt ut labore et dolore       24   tempus urna et.               \r\n    5   magna aliqua. Ut placerat orci       25                                 \r\n    6   nulla pellentesque dignissim         26   Enim praesent elementum       \r\n    7   enim. Feugiat pretium nibh           27   facilisis leo. Porttitor lacus\r\n    8   ipsum consequat nisl vel             28   luctus accumsan tortor        \r\n    9   pretium. Parturient montes           29   posuere. Ornare arcu odio ut  \r\n   10   nascetur ridiculus mus mauris        30   sem nulla pharetra. Porta     \r\n   11   vitae ultricies leo integer.         31   lorem mollis aliquam ut       \r\n   12   Non diam phasellus vestibulum        32   porttitor. Libero volutpat sed\r\n   13   lorem sed. Morbi tincidunt           33   cras ornare arcu dui. Netus et\r\n   14   augue interdum velit euismod.        34   malesuada fames ac turpis     \r\n   15   Sit amet massa vitae tortor          35   egestas integer. Dictum sit   \r\n   16   condimentum lacinia quis vel.        36   amet justo donec. Nisi est sit\r\n   17   Sodales ut eu sem integer            37   amet facilisis magna etiam.   \r\n   18   vitae. Ac turpis egestas             38   Malesuada pellentesque elit   \r\n   19   integer eget aliquet nibh            39   eget gravida. At elementum eu \r\n   20   praesent tristique. Tellus at        40   facilisis sed odio morbi quis \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n2024-01-17 12:45                      Example text                       Page: 2\r\n\r\n\r\n   41   commodo. Ut venenatis tellus  \r\n   42   in metus vulputate eu         \r\n   43   scelerisque felis imperdiet.  \r\n   44   Donec ac odio tempor orci     \r\n   45   dapibus. Non arcu risus quis  \r\n   46   varius quam. Dignissim diam   \r\n   47   quis enim lobortis scelerisque\r\n   48   fermentum dui faucibus. Et    \r\n   49   tortor at risus viverra       \r\n   50   adipiscing at in tellus       \r\n   51   integer.                      \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n```\r\n\r\n\u003c/details\u003e\r\n\r\n### No paging, single column\r\n\r\n```shell\r\ncolumnizer -c 1 -t \"Example text\" --single-page text.txt \u003e output.txt\r\n```\r\n\r\n\u003e If `--single-page` is specified, in normal mode (not `--across`) only the first column will be filled in,\r\n\u003e because formatting occurs in real time and PyColumnizer does not know the final amount of text in order\r\n\u003e to divide it into columns\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003eoutput.txt\u003c/summary\u003e\r\n\r\n```text\r\n\r\n\r\n2024-01-17 12:47                                                    Example text\r\n\r\n\r\n    1   Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod \r\n    2   tempor incididunt ut labore et dolore magna aliqua. Ut placerat orci    \r\n    3   nulla pellentesque dignissim enim. Feugiat pretium nibh ipsum consequat \r\n    4   nisl vel pretium. Parturient montes nascetur ridiculus mus mauris vitae \r\n    5   ultricies leo integer. Non diam phasellus vestibulum lorem sed. Morbi   \r\n    6   tincidunt augue interdum velit euismod. Sit amet massa vitae tortor     \r\n    7   condimentum lacinia quis vel. Sodales ut eu sem integer vitae. Ac turpis\r\n    8   egestas integer eget aliquet nibh praesent tristique. Tellus at urna    \r\n    9   condimentum mattis pellentesque id. Et malesuada fames ac turpis egestas\r\n   10   sed tempus urna et.                                                     \r\n   11                                                                           \r\n   12   Enim praesent elementum facilisis leo. Porttitor lacus luctus accumsan  \r\n   13   tortor posuere. Ornare arcu odio ut sem nulla pharetra. Porta lorem     \r\n   14   mollis aliquam ut porttitor. Libero volutpat sed cras ornare arcu dui.  \r\n   15   Netus et malesuada fames ac turpis egestas integer. Dictum sit amet     \r\n   16   justo donec. Nisi est sit amet facilisis magna etiam. Malesuada         \r\n   17   pellentesque elit eget gravida. At elementum eu facilisis sed odio morbi\r\n   18   quis commodo. Ut venenatis tellus in metus vulputate eu scelerisque     \r\n   19   felis imperdiet. Donec ac odio tempor orci dapibus. Non arcu risus quis \r\n   20   varius quam. Dignissim diam quis enim lobortis scelerisque fermentum dui\r\n   21   faucibus. Et tortor at risus viverra adipiscing at in tellus integer.   \r\n\r\n```\r\n\r\n\u003c/details\u003e\r\n\r\n### 3 columns, across formatting, custom width, date format, separator, line numbering and header\r\n\r\n```shell\r\ncolumnizer -a -c 3 -w 100 -p 25 --date-format \"%d.%m.%Y\" -s \" - \" -t \"Example text\" --line-number-placeholder \"{line:\u003e2} \" --first-line-number 0 --lines-before-header 0 --lines-after-header 1 text.txt \u003e output.txt\r\n```\r\n\r\n\u003e If `-a` or `--across` is specified, the text will be divided into columns from left to right,\r\n\u003e then from top to bottom\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003eoutput.txt\u003c/summary\u003e\r\n\r\n```text\r\n17.01.2024                                   Example text                                    Page: 1\r\n\r\n 0 Lorem ipsum dolor sit amet,  -  1 consectetur adipiscing elit, -  2 sed do eiusmod tempor       \r\n 3 incididunt ut labore et      -  4 dolore magna aliqua. Ut      -  5 placerat orci nulla         \r\n 6 pellentesque dignissim enim. -  7 Feugiat pretium nibh ipsum   -  8 consequat nisl vel pretium. \r\n 9 Parturient montes nascetur   - 10 ridiculus mus mauris vitae   - 11 ultricies leo integer. Non  \r\n12 diam phasellus vestibulum    - 13 lorem sed. Morbi tincidunt   - 14 augue interdum velit        \r\n15 euismod. Sit amet massa      - 16 vitae tortor condimentum     - 17 lacinia quis vel. Sodales ut\r\n18 eu sem integer vitae. Ac     - 19 turpis egestas integer eget  - 20 aliquet nibh praesent       \r\n21 tristique. Tellus at urna    - 22 condimentum mattis           - 23 pellentesque id. Et         \r\n24 malesuada fames ac turpis    - 25 egestas sed tempus urna et.  - 26                             \r\n27 Enim praesent elementum      - 28 facilisis leo. Porttitor     - 29 lacus luctus accumsan tortor\r\n30 posuere. Ornare arcu odio ut - 31 sem nulla pharetra. Porta    - 32 lorem mollis aliquam ut     \r\n33 porttitor. Libero volutpat   - 34 sed cras ornare arcu dui.    - 35 Netus et malesuada fames ac \r\n36 turpis egestas integer.      - 37 Dictum sit amet justo donec. - 38 Nisi est sit amet facilisis \r\n39 magna etiam. Malesuada       - 40 pellentesque elit eget       - 41 gravida. At elementum eu    \r\n42 facilisis sed odio morbi     - 43 quis commodo. Ut venenatis   - 44 tellus in metus vulputate eu\r\n45 scelerisque felis imperdiet. - 46 Donec ac odio tempor orci    - 47 dapibus. Non arcu risus quis\r\n48 varius quam. Dignissim diam  - 49 quis enim lobortis           - 50 scelerisque fermentum dui   \r\n51 faucibus. Et tortor at risus - 52 viverra adipiscing at in     - 53 tellus integer.             \r\n\r\n\r\n\r\n\r\n\r\n\r\n```\r\n\r\n\u003c/details\u003e\r\n\r\n### Justified columns, no header and line numbers, empty lines are skipped\r\n\r\n```shell\r\ncolumnizer -j -c 2 -p 30 -t \"Example text\" --no-header --no-line-numbers --skip-empty-lines text.txt \u003e output.txt\r\n```\r\n\r\n\u003e If `-j` or `--justify` is specified, the text in each column will be justified\r\n\u003e\r\n\u003e If `--skip-empty-lines` is specified, empty lines will not be rendered\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003eoutput.txt\u003c/summary\u003e\r\n\r\n```text\r\nLorem    ipsum    dolor    sit   amet,    fames   ac   turpis  egestas  integer.\r\nconsectetur  adipiscing  elit,  sed do    Dictum  sit amet justo donec. Nisi est\r\neiusmod tempor incididunt ut labore et    sit   amet   facilisis   magna  etiam.\r\ndolore  magna aliqua. Ut placerat orci    Malesuada   pellentesque   elit   eget\r\nnulla   pellentesque  dignissim  enim.    gravida. At elementum eu facilisis sed\r\nFeugiat  pretium  nibh ipsum consequat    odio  morbi quis commodo. Ut venenatis\r\nnisl  vel  pretium.  Parturient montes    tellus    in    metus   vulputate   eu\r\nnascetur  ridiculus  mus  mauris vitae    scelerisque  felis imperdiet. Donec ac\r\nultricies   leo   integer.   Non  diam    odio  tempor  orci  dapibus.  Non arcu\r\nphasellus  vestibulum lorem sed. Morbi    risus quis varius quam. Dignissim diam\r\ntincidunt    augue    interdum   velit    quis    enim    lobortis   scelerisque\r\neuismod.  Sit  amet massa vitae tortor    fermentum  dui  faucibus. Et tortor at\r\ncondimentum  lacinia quis vel. Sodales    risus  viverra adipiscing at in tellus\r\nut  eu  sem  integer  vitae. Ac turpis    integer.                              \r\negestas   integer  eget  aliquet  nibh\r\npraesent  tristique.  Tellus  at  urna\r\ncondimentum mattis pellentesque id. Et\r\nmalesuada  fames ac turpis egestas sed\r\ntempus             urna            et.\r\nEnim praesent elementum facilisis leo.\r\nPorttitor lacus luctus accumsan tortor\r\nposuere. Ornare arcu odio ut sem nulla\r\npharetra.  Porta  lorem mollis aliquam\r\nut porttitor. Libero volutpat sed cras\r\nornare  arcu  dui.  Netus et malesuada\r\n\r\n\r\n\r\n\r\n\r\n\r\n```\r\n\r\n\u003c/details\u003e\r\n\r\n### Piped input\r\n\r\n```shell\r\necho \"Some piped text here\\nAnother line\\n\\nAnd another one after blank line\" | columnizer -c 2 -p 15 \u003e output.txt\r\n```\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003eoutput.txt\u003c/summary\u003e\r\n\r\n```text\r\n\r\n\r\n2024-01-17 13:23                                                         Page: 1\r\n\r\n\r\n    1   Some piped text here          \r\n    2   Another line                  \r\n    3                                 \r\n    4   And another one after blank   \r\n    5   line                          \r\n\r\n\r\n\r\n\r\n\r\n\r\n```\r\n\r\n\u003c/details\u003e\r\n\r\n----------\r\n\r\n## ✨ Contribution\r\n\r\n- Anyone can contribute! Just create a pull request\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ff33rni%2Fpycolumnizer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ff33rni%2Fpycolumnizer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ff33rni%2Fpycolumnizer/lists"}