code: func NewCustomColumnsPrinterFromTemplate(templateReader io.Reader, decoder runtime.Decoder) (*CustomColumnsPrinter, error) {
  	scanner := bufio.NewScanner(templateReader)
  	if !scanner.Scan() {
  		return nil, fmt.Errorf("invalid template, missing header line. Expected format is one line of space separated headers, one line of space separated column specs.")
  	}
  	headers := splitOnWhitespace(scanner.Text())
  
  	if !scanner.Scan() {
  		return nil, fmt.Errorf("invalid template, missing spec line. Expected format is one line of space separated headers, one line of space separated column specs.")
  	}
  	specs := splitOnWhitespace(scanner.Text())
  
  	if len(headers) != len(specs) {
  		return nil, fmt.Errorf("number of headers (%d) and field specifications (%d) don't match", len(headers), len(specs))
  	}
  
  	columns := make([]Column, len(headers))
  	for ix := range headers {
  		spec, err := RelaxedJSONPathExpression(specs[ix])
  		if err != nil {
  			return nil, err
  		}
  		columns[ix] = Column{
  			Header:    headers[ix],
  			FieldSpec: spec,
  		}
  	}
  	return &CustomColumnsPrinter{Columns: columns, Decoder: decoder, NoHeaders: false}, nil
  }
docs: // NewCustomColumnsPrinterFromTemplate creates a custom columns printer from a template stream.  The template is expected
  // to consist of two lines, whitespace separated.  The first line is the header line, the second line is the jsonpath field spec
  // For example, the template below:
  // NAME               API_VERSION
  // {metadata.name}    {apiVersion}