workgroups/vendor/github.com/posener/script/cut.go
Marvin Preuss f121b05b58
Some checks failed
continuous-integration/drone/push Build is failing
repo: adds goreadme
2021-09-24 18:29:05 +02:00

52 lines
1.2 KiB
Go

package script
import (
"bytes"
"fmt"
)
// Cut takes selected fields from each line. The fields are 1 based (first field is 1).
//
// Shell command: `cut -f<Fields>`.
func (s Stream) Cut(fields ...int) Stream {
return s.Modify(Cut{Fields: fields})
}
// Cut is a `Modifier` that takes selected fields from each line according to a given delimiter.
// The default delimiter is tab.
//
// Shell command: `cut -d<Delim> -f<Fields>`.
type Cut struct {
// Fields defines which fields will be collected to the output of the command. The fields are 1
// based (first field is 1).
Fields []int
// Delim is the delimited by which the fields of each line are sparated.
Delim []byte
}
func (c Cut) Modify(line []byte) (modifed []byte, err error) {
if line == nil {
return nil, nil
}
if len(c.Fields) == 0 {
return nil, nil
}
if len(c.Delim) == 0 {
c.Delim = []byte{'\t'}
}
parts := bytes.Split(line, c.Delim)
out := make([][]byte, 0, len(parts))
for _, i := range c.Fields {
i-- // Fields are 1 based, translate to zero base.
if i < len(parts) {
out = append(out, parts[i])
}
}
return append(bytes.Join(out, c.Delim), '\n'), nil
}
func (c Cut) Name() string {
return fmt.Sprintf("cut(%v, delim=%v)", c.Fields, c.Delim)
}