awk ' # rotate # Input line: string (tab) ["b"|"e"|"a"] (tab) number # Output several lines: # string (tab) ["b"|"e"|"a"] (tab) number # rotated string (tab) ["b"|"e"|"a"] (tab) number # rotated string (tab) ["b"|"e"|"a"] (tab) number # ... # # In the output strings, tildes are replaced by spaces BEGIN { FS = OFS = "\t" } / %key / { # if explicit sort.key is provided, do not rotate print $0 next } { t1 = $1 #t1 will be $1 with tildes changed to spaces gsub(/%~/, "QQ5QQ", t1) #hide real tildes gsub(/~/, " ", t1) #change tildes to spaces gsub(/QQ5QQ/, "%~", t1) #restore real tildes print t1, $2, $3 i = 1 while ((j = index(substr($1, i+1), " ")) > 0) { i += j printf("%s, %s\t%s\t%s\n", \ substr(t1, i+1), substr(t1, 1, i-1), $2, $3) } } ' $*