4

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?

muru
  • 193,181
  • 53
  • 473
  • 722
Annabella
  • 55
  • 6

2 Answers2

5

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:

N0rbert
  • 97,162
  • 34
  • 239
  • 423
  • Couldn't you avoid the awks and intermediate files altogether here? ex. `{ printf '%s\n' '**Word**|**Abbreviation**' '-|-'; paste -d '|' - - < words+abbrs.txt; }` – steeldriver Dec 23 '21 at 18:50
  • @steeldriver Thanks, added. Could you please recommend me a good AWK and Bash old-school comprehensive online howto or book? – N0rbert Dec 23 '21 at 18:53
  • I usually find myself referring to [The GNU Awk User’s Guide](https://www.gnu.org/software/gawk/manual/html_node/index.html#SEC_Contents) for awk stuff (it's pretty good about highlighting where gawk differs from other implementations). For bash itself I'm not sure really - I like [BashGuide](https://mywiki.wooledge.org/BashGuide) - obviously the man page is comprehensive but I find it difficult to navigate. – steeldriver Dec 23 '21 at 19:03
  • Thanks, added both pages to bookmarks. https://tldp.org/LDP/abs/html/abs-guide.html also looks good. – N0rbert Dec 23 '21 at 19:20
3

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.)

muru
  • 193,181
  • 53
  • 473
  • 722