# Creating .bib file containing only the cited references of a bigger .bib file

Normally, LaTeX will only create references for the BibTeX entries cited in the text. Is there a way of extracting these entries into a different `.bib` file automatically? For example if I have a `.bib` file with two entries, and only one is cited in a particular text, I need a way of creating a new `.bib` file with just that reference.

-

## migrated from stackoverflow.comJan 21 '12 at 14:42

This question came from our site for professional and enthusiast programmers.

For Mac users of BibDesk, there is BBL to BIB with BibDesk. – Adam Liter Sep 19 '13 at 3:08
For Windows, JabRef provides this capacity: see [here][1] [1]: tex.stackexchange.com/questions/98370/… – user59315 Jul 18 '14 at 14:10
might be a duplicate of tex.stackexchange.com/questions/417/… – lenz Feb 23 '15 at 0:09

With a TeX Live distribution (possibly also with MiKTeX) there is a `bibexport` program. Assuming your document is `myarticle.tex`, you have to compile it normally and then you call

``````bibexport -o extracted.bib myarticle.aux
``````

where `extracted.bib` is the name that you want to give to your new `.bib` file. Notice that you have to give the extension `.aux` (or no extension at all).

Then you have to change the name of the `.bib` file in your document, in order to use `extracted.bib`.

-
+1 Nice tool. I didn't know it. – Marco Daniel Jan 21 '12 at 15:38
In MiKTeX 2.9 this tool is missing :-( – Kurt Feb 15 '13 at 16:24
Although this falls outside of the scope of the question, perhaps a brief word about how this tool does not work with `biber`-driven bibliographies (or with `.bib` files that use `biblatex` fields such as `date` instead of `year`) is in order. – jon Feb 15 '13 at 16:29
@jon `bibexport` uses BibTeX for doing its job. The manual tells how to add new fields (section 1.4). For `biblatex`/Biber compatibility the script should look not only for `\citation` commands in the `aux` file but also for `\abx@aux@cite`. – egreg Feb 15 '13 at 16:42
@egreg -- Right. I was thinking more for people who look at your answer, but don't realize why `bibexport` isn't working for them; most of them are not going to be modifying `bibexport.sh`. Another problem that might arise is if you use non-standard entry types (from BibTeX's perspective). I use `@Collectio{<key>,...`, e.g., for essay collections; that comes through as `@{<key>,...`. – jon Feb 15 '13 at 20:02

`jabref` can do this in both command line and gui modes.

First gui mode:

Keep your `master.bib` file open in jabref. Then in `Tools``New subdatase based on AUX file` to get

Here select the `.aux` file, click `parse`, and `select` and the `generate`. You should get a sub database opened in jabref. Save it.

From command line, assuming that you take care of paths do this:

``````jabref.jar -a filename[.aux],newBibFile[.bib]
``````

Useful link for command line options to jabref: enter link description here

-

With `biblatex`/`biber` you can use

``````biber document-base-name.bcf --output_format=bibtex
``````
-
The above command doesn't work with entries using the `crossref` field. – asr Apr 18 '14 at 14:32
@asr See my answer below. You just need to tell `biber` to do this. – cfr Nov 14 '14 at 2:29

This is a supplement to pavel's answer which aims to address an issue raised in the comments. It is therefore a more specific solution than the one there: the simpler command will work fine if you don't need to resolve `crossref` fields in `.bib` entries.

In order to resolve `crossref` fields in a `.bib` file when using `biblatex`/`biber`, you need to tell `biber` what to do.

Given `<filename>.tex`, run:

``````pdflatex <filename>.tex
biber --output_format=bibtex --output_resolve <filename>.bcf
``````

Where `latex`, `xelatex`, `lualatex` etc. can be substituted for `pdflatex` as appropriate. So long as it generates your `.bcf` it is fine.

-
It works. Thanks! – asr Nov 18 '14 at 11:51

In addition to egreg's answer, I'd like to point out an alternative solution. Nelson Beebe has developed utilities called `bibextract`, `citetags` and `citefind` to handle sub-bibliography databases. You can obtain them here.

In this case, you would compile the document normally and then type in a shell

``````citetags myarticle.aux > myarticle-tags
citefind myarticle-tags mybib.bib > mysubbib.bib
``````

The first command prints all the citation keys used in your `.tex`, while the second selects all the entries from `my bib.bib` with keys from `myarticle-tags`. Of course, one can easily write a script to merge the two commands if needed.

Although it works in a similar fashion as `bibexport`, this solution has the advantage that it does not delete the `biblatex` fields such as `date`, while `bibexport` does by default as mentioned in the comments. It also works with `biblatex` if you use `bibtex` as a backend, but as far as I know, it does not if you use `biber`.

-

Corentin's solution worked for my case where I needed to combine cited references from multiple .tex documents into one bib file. I had trouble installing `bibextract` on OSX for two reasons: 1) nawk is not installed by default and 2) the CHECKSUM command in the makefile prevented the sh and awk files from being installed. After running, `./configure`, modifify the Makefile as follows:

change:

``````SEDCMD          = \$(SED) -e 's=@LIBDIR@=\$(LIBDIR)=g' \
-e 's=@BINDIR@=\$(BINDIR)=g' \
-e 's=/bin/sed=\$(SED)=g'
``````

to

``````SEDCMD          = \$(SED) -e 's=@LIBDIR@=\$(LIBDIR)=g' \
-e 's=@BINDIR@=\$(BINDIR)=g' \
-e 's=/bin/sed=\$(SED)=g' \
-e 's=nawk -f=awk -f=g'
``````

then change

``````        \$(SEDCMD) \$\$f.sh | \$(CHECKSUM) > \$(BINDIR)/\$\$f ; \
\$(SEDCMD) \$\$f.awk | \$(CHECKSUM) > \$(LIBDIR)/\$\$f.awk ; \
\$(SEDCMD) \$\$f.man | \$(CHECKSUM) > \$(MANDIR)/\$\$f.\$(MANEXT) ; \
``````

to

``````        \$(SEDCMD) \$\$f.sh > \$(BINDIR)/\$\$f ; \
\$(SEDCMD) \$\$f.awk > \$(LIBDIR)/\$\$f.awk ; \
\$(SEDCMD) \$\$f.man > \$(MANDIR)/\$\$f.\$(MANEXT) ; \
``````

then run `sudo make install` and `bibextract` will work as noted above.

-