How do I make a Markdown table of two columns out of a list whose items alternate to each column?

I have a long list of common abbreviations for words in periodical titles. In the list, the full word is followed by its abbreviation. For example:

  • Administration
  • Admin.
  • Applied
  • Appl.
  • Administrative
  • Administ.
  • Approximate
  • Approx.

I want to turn the list into a Markdown table, like this:

Word Abbreviation
Administration Admin.
Applied Appl.

The problem is that doing this by hand would take forever. So, I'm looking for some way to do this faster. If it helps, all of the abbreviated forms end with a period (.).

I've looked online but couldn't find anything for this. That's why I'm asking here. Any help?


Let's assume that we have input file with list from your question. We can fill it using below command:

cat <<EOF > words+abbrs.txt
Administration
Admin.
Applied
Appl.
Administrative
Administ.
Approximate
Approx.
EOF

Creation of Markdown table is possible on Ubuntu using simple scripting as shown below:

  • dumb step-by-step method

    # write table header
    echo "**Word** | **Abbreviation**" > table.md
    echo "- | -" >> table.md
    
    # extract odd lines as words to file words.txt
    awk 'NR%2==1' words+abbrs.txt > words.txt
    # extract even lines as abbreviations to file abbrs.txt
    awk 'NR%2==0' words+abbrs.txt > abbrs.txt
    
    # combine columns from words.txt and abbrs.txt with '|' separator
    paste -d '|' words.txt abbrs.txt >> table.md
    
  • smart one-liner method (thanks to @steeldriver)

    { printf '%s\n' '**Word** | **Abbreviation**' '-|-'; paste -d '|' - - < words+abbrs.txt; } > table.md
    

You will get the Markdown file with the following contents:

$ cat table.md 
**Word** | **Abbreviation**
- | -
Administration|Admin.
Applied|Appl.
Administrative|Administ.
Approximate|Approx.

So it will be rendered to HTML as

Word Abbreviation
Administration Admin.
Applied Appl.
Administrative Administ.
Approximate Approx.

More info about used tools:

  • man awk locally or online;
  • man paste locally or online
  • The GNU Awk User’s Guide
  • BashGuide
  • Advanced Bash-Scripting Guide

If you can use Pandoc, it can convert from CSV to Markdown. Assuming you have a file of words one per line like in N0rbert's answer, you can convert it to a CSV using paste -d, - -, and then send it to Pandoc:

% (printf "%s\n" Word Abbreviation; cat input-file) | paste -d, - - | pandoc -f csv -t markdown_phpextra
| Word           | Abbreviation |
|----------------|--------------|
| Administration | Admin.       |
| Applied        | Appl.        |
| Administrative | Administ.    |
| Approximate    | Approx.      |

Giving:

Word Abbreviation
Administration Admin.
Applied Appl.
Administrative Administ.
Approximate Approx.

(Further formatting of the heading is probably not required since table headers are usually formatted differently.)