---
name: "Catmandu::Fix::marc_cut"
section: "3pm"
platform: "linux"
package: "libcatmandu-marc-perl"
version: "1.320-1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Catmandu::Fix::marc_cut"
---

# Catmandu::Fix::marc\_cut(3pm)

cut marc data in a structured way to a new field

## NAME

Catmandu::Fix::marc\_cut - cut marc data in a structured way to a new field

## SYNOPSIS

```
    # Cut the 001 field out of the MARC record into the fixed001
    marc_cut(001, fixed001)
    # Cut all 650 fields out of the MARC record into the subjects array
    marc_cut(650, subjects)
```

## DESCRIPTION

This Fix work like Catmandu::Fix::marc\_copy except it will also remove all mathincg fields from the MARC record

## METHODS

### marc\_cut(MARC\_PATH, JSON\_PATH, \[equals: REGEX\])

Cut this MARC fields referred by a MARC\_PATH to a JSON\_PATH. hen an `"equals"` value has been provided, then only the MARC\_PATHs with a value equal to `"equals"` will be cut to JSON\_PATH. When the MARC\_PATH points to a subfield, then the subfield value need to match `"equals"`. When the MARC\_PATH points multiple subfields, then a concatinated string value needs to match `"equals"`:

```
    Data:
    100 $aMy$bField.
    # cut only the 100 fields which have a $a subfield
    marc_cut(100a,tmp)
    # cut only the 100 fields with have a $a subfield matching 'My'
    marc_cut(100a,tmp,equals:"My")
    # cut only the 100 fields with have a concatinated string value 'MyField.'
    # (equals is an regex, the period "." needs to be escaped "\.")
    marc_cut(100,tmp,equals:"MyField\.")
    # cut only the 100 fields which have a "." at the end
    marc_cut(100,tmp,equals:"\.$")
```

More examples:

```
    # Cut all the 300 fields
    marc_cut(300,tmp)
    # Cut all the 300 fields with indicator 1 = 1
    marc_cut(300[1],tmp)
    # Cut all the 300 fields which have subfield c
    marc_cut(300c,tmp)
    # Cut all the 300 fields which have subfield c equal to 'ABC'
    marc_cut(300c,tmp,equals:"^ABC")
```

The JSON\_PATH `"tmp"` will contain an array with one item per field that was cut. Each item is a hash containing the following fields:

```
  tmp.*.tag        - The names of the MARC field
  tmp.*.ind1       - The value of the first indicator
  tmp.*.ind2       - The value of the second indicator
  tmp.*.subfields  - An array of subfield items. Each subfield item is a
                     hash of the subfield code and subfield value
```

E.g.

```
    tmp:
    - tag: '300'
      ind1: ' '
      ind2: ' '
      subfields:
      - a: 'blabla:'
      - v: 'test123'
      - c: 'ok123'
```

These JSON paths can be used like:

```
    # Set the first indicator of all 300 fields
    do marc_each(var:this)
      if all_match(this.tag,300)
        # Set the first indicator to 1
        set_field(this.ind1,1)
        marc_paste(this)
      end
    end
    # Capitalize all the v subfields of 300
    do marc_each(var:this)
      if all_match(this.tag,300)
         do list(path:this.subfields, var:loop)
            if (exists(loop.v))
                upcase(loop.v)
            end
         end
         marc_paste(this)
      end
    end
```

## INLINE

This Fix can be used inline in a Perl script:

```
    use Catmandu::Fix::marc_copy as => 'marc_cut';
    my $data = { record => ['650', ' ', 0, 'a', 'Perl'] };
    $data = marc_cut($data,'650','subject');
    print $data->{subject}->[0]->{tag} , "\n"; # '650'
    print $data->{subject}->[0]->{ind1} , "\n"; # ' '
    print $data->{subject}->[0]->{ind2} , "\n"; # 0
    print $data->{subject}->[0]->{subfields}->[0]->{a} , "\n"; # 'Perl'
```

## SEE ALSO

- •

  Catmandu::Fix::marc\_copy

- •

  Catmandu::Fix::marc\_paste

## LICENSE AND COPYRIGHT

This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License.

See http://dev.perl.org/licenses/ for more information.
