#!/usr/bin/awk -f
# This AWK script implements the second variant.
# It renumbers the footnotes in the text and then reorders the footnote descriptions.
# Renumbering happens line per line, but sorting of footnotes needs an array.
#
# usage: ./footnotes.awk < sample4.txt
BEGIN {
ORS = ""
footnotesSection = 0;
footnoteCounter = 1;
lastSortedFootnote = 0;
}
/^@footnote:$/ {
footnotesSection = 1;
next;
}
# matches lines with footnotes in the main text
/\[[0-9]+\]/ && footnotesSection == 0 {
scannerOffset = 1;
footnoteStartOffset = 1;
while(0 != (footnoteStartOffset = match(substr($0, scannerOffset), "\\[[0-9]+\\]"))) {
print substr($0, scannerOffset, footnoteStartOffset -1);
footnoteStartOffset = footnoteStartOffset + scannerOffset - 1;
footnoteStopOffset = index(substr($0, footnoteStartOffset), "]");
footnote = substr($0, footnoteStartOffset + 1, footnoteStopOffset - 2);
if(footnote in footnoteMap) {
print "[" footnoteMap[footnote] "]";
} else {
print "[" footnoteCounter "]";
footnoteMap[footnote] = footnoteCounter;
footnoteCounter++;
}
scannerOffset = footnoteStartOffset + footnoteStopOffset;
}
print substr($0, scannerOffset) "\n";
next;
}
# matches lines with footnotes in the footnote section
/^\[[0-9]+\]/ && footnotesSection == 1 {
footnote = substr($0, 2, index($0, "]") - 2);
lastSortedFootnote = footnoteMap[footnote];
footnoteContainer[lastSortedFootnote] = "[" lastSortedFootnote "]" substr($0, index($0, "]") + 1) "\n";
next;
}
# matches lines without footnotes in the main text
// && footnotesSection == 0 {
print $0 "\n";
next;
}
# matches lines without footnotes in the footnote section
// && footnotesSection == 1 {
footnoteContainer[lastSortedFootnote] = footnoteContainer[lastSortedFootnote] $0 "\n";
next;
}
# print sorted footnote section
END {
print "@footnote:\n";
for (x = 0; x < footnoteCounter; x++) {
if(length(footnoteContainer[x]) == 0) {
print "[" x "] \n";
} else {
print footnoteContainer[x];
}
}
}