function normalizePath(path) { if (length(path) == 0) path = "." path = path pathDelimiter gsub((pathDelimiter "+"), pathDelimiter, path) return path } BEGIN { pathDelimiter = "/" pathLength = length(path = normalizePath(path)) referenceLength = length(reference = normalizePath(reference)) minimumLength = pathLength if (referenceLength < minimumLength) minimumLength = referenceLength prefixLength = 0 for (i=1; i<=minimumLength; ++i) { character = substr(reference, i, 1) if (substr(path, i, 1) != character) break if (character == pathDelimiter) prefixLength = i } if ((prefixLength > 0) || ((substr(path, 1, 1) == pathDelimiter) == (substr(reference, 1, 1) == pathDelimiter))) { suffix = substr(path, prefixLength+1) prefix = substr(reference, prefixLength+1) gsub(("[^" pathDelimiter "]+"), "..", prefix) path = normalizePath(prefix suffix) } path = normalizePath(path) sub((pathDelimiter "$"), "", path) printf "%s", path exit 0 }