eBay's TSV Utilities: Command line tools for large, tabular data files. Filtering, statistics, sampling, joins and more.

Overview

Command line utilities for tabular data files

This is a set of command line utilities for manipulating large tabular data files. Files of numeric and text data commonly found in machine learning and data mining environments. Filtering, sampling, statistics, joins, and more.

These tools are especially useful when working with large data sets. They run faster than other tools providing similar functionality, often by significant margins. See Performance Studies for comparisons with other tools.

File an issue if you have problems, questions or suggestions.

In this README:

Additional documents:

Talks and blog posts:

GitHub Workflow Status Codecov GitHub release Github commits (since latest release) GitHub last commit license

Tools overview

These tools perform data manipulation and statistical calculations on tab delimited data. They are intended for large files. Larger than ideal for loading entirely in memory in an application like R, but not so big as to necessitate moving to Hadoop or similar distributed compute environments. The features supported are useful both for standalone analysis and for preparing data for use in R, Pandas, and similar toolkits.

The tools work like traditional Unix command line utilities such as cut, sort, grep and awk, and are intended to complement these tools. Each tool is a standalone executable. They follow common Unix conventions for pipeline programs. Data is read from files or standard input, results are written to standard output. Fields are identified either by field name or field number. The field separator defaults to TAB, but any character can be used. Input and output is UTF-8, and all operations are Unicode ready, including regular expression match (tsv-filter). Documentation is available for each tool by invoking it with the --help option. Most tools provide a --help-verbose option offering more extensive, reference style documentation. TSV format is similar to CSV, see Comparing TSV and CSV formats for the differences.

The rest of this section contains descriptions of each tool. Click on the links below to jump directly to one of the tools. Full documentation is available in the Tools Reference. The first tool listed, tsv-filter, provides a tutorial introduction to features found throughout the toolkit.

  • tsv-filter - Filter lines using numeric, string and regular expression comparisons against individual fields.
  • tsv-select - Keep a subset of columns (fields). Like cut, but supporting named fields, field reordering, and field exclusions.
  • tsv-uniq - Filter out duplicate lines using either the full line or individual fields as a key.
  • tsv-summarize - Summary statistics on selected fields, against the full data set or grouped by key.
  • tsv-sample - Sample input lines or randomize their order. A number of sampling methods are available.
  • tsv-join - Join lines from multiple files using fields as a key.
  • tsv-pretty - Print TSV data aligned for easier reading on the command-line.
  • csv2tsv - Convert CSV files to TSV.
  • tsv-split - Split data into multiple files. Random splits, random splits by key, and splits by blocks of lines.
  • tsv-append - Concatenate TSV files. Header-aware; supports source file tracking.
  • number-lines - Number the input lines.
  • keep-header - Run a shell command in a header-aware fashion.

tsv-filter

Filter lines by running tests against individual fields. Multiple tests can be specified in a single call. A variety of numeric and string comparison tests are available, including regular expressions.

Consider a file having 4 fields: id, color, year, count. Using tsv-pretty to view the first few lines:

$ tsv-pretty data.tsv | head -n 5
 id  color   year  count
100  green   1982    173
101  red     1935    756
102  red     2008   1303
103  yellow  1873    180

The following command finds all entries where 'year' (field 3) is 2008:

$ tsv-filter -H --eq year:2008 data.tsv

The -H option indicates the first input line is a header. The --eq operator performs a numeric equality test. String comparisons are also available. The following command finds entries where 'color' (field 2) is "red":

$ tsv-filter -H --str-eq color:red data.tsv

Fields can also be identified by field number, same as traditional Unix tools. This works for files with and without header lines. The following commands are equivalent to the previous two:

$ tsv-filter -H --eq 3:2008 data.tsv
$ tsv-filter -H --str-eq 2:red data.tsv

Multiple tests can be specified. The following command finds red entries with year between 1850 and 1950:

$ tsv-filter -H --str-eq color:red --ge year:1850 --lt year:1950 data.tsv

Viewing the first few results produced by this command:

$ tsv-filter -H --str-eq color:red --ge year:1850 --lt year:1950 data.tsv | tsv-pretty | head -n 5
 id  color  year  count
101  red    1935    756
106  red    1883   1156
111  red    1907   1792
114  red    1931   1412

The --count option switches from filtering to counting matched records. Header lines are excluded from the count. The following command prints the number of red entries in data.tsv (there are nine):

$ tsv-filter -H --count --str-eq color:red data.tsv
9

The --label option is another alternative to filtering. In this mode, a new field is added to every record indicating if it satisfies the criteria. The next command marks records to indicate if year is in the 1900s:

$  tsv-filter -H --label 1900s --ge year:1900 --lt year:2000 data.tsv | tsv-pretty | head -n 5
 id  color   year  count  1900s
100  green   1982    173      1
101  red     1935    756      1
102  red     2008   1303      0
103  yellow  1873    180      0

The --label-values option can be used to customize the values used to mark records.

Files can be placed anywhere on the command line. Data will be read from standard input if a file is not specified. The following commands are equivalent:

$ tsv-filter -H --str-eq color:red --ge year:1850 --lt year:1950 data.tsv
$ tsv-filter data.tsv -H --str-eq color:red --ge year:1850 --lt year:1950
$ cat data.tsv | tsv-filter -H --str-eq color:red --ge year:1850 --lt year:1950

Multiple files can be provided. Only the header line from the first file will be kept when the -H option is used:

$ tsv-filter -H data1.tsv data2.tsv data3.tsv --str-eq 2:red --ge 3:1850 --lt 3:1950
$ tsv-filter -H *.tsv --str-eq 2:red --ge 3:1850 --lt 3:1950

Numeric comparisons are among the most useful tests. Numeric operators include:

  • Equality: --eq, --ne (equal, not-equal).
  • Relational: --lt, --le, --gt, --ge (less-than, less-equal, greater-than, greater-equal).

Several filters are available to help with invalid data. Assume there is a messier version of the 4-field file where some fields are not filled in. The following command will filter out all lines with an empty value in any of the four fields:

$ tsv-filter -H messy.tsv --not-empty 1-4

The above command uses a "field list" to run the test on each of fields 1-4. The test can be "inverted" to see the lines that were filtered out:

$ tsv-filter -H messy.tsv --invert --not-empty 1-4 | head -n 5 | tsv-pretty
 id  color   year  count
116          1982     11
118  yellow          143
123  red              65
126                   79

There are several filters for testing characteristics of numeric data. The most useful are:

  • --is-numeric - Test if the data in a field can be interpreted as a number.
  • --is-finite - Test if the data in a field can be interpreted as a number, but not NaN (not-a-number) or infinity. This is useful when working with data where floating point calculations may have produced NaN or infinity values.

By default, all tests specified must be satisfied for a line to pass a filter. This can be changed using the --or option. For example, the following command finds records where 'count' (field 4) is less than 100 or greater than 1000:

$ tsv-filter -H --or --lt 4:100 --gt 4:1000 data.tsv | head -n 5 | tsv-pretty
 id  color  year  count
102  red    2008   1303
105  green  1982     16
106  red    1883   1156
107  white  1982      0

A number of string and regular expression tests are available. These include:

  • Equality: --str-eq, --str-ne
  • Partial match: --str-in-fld, --str-not-in-fld
  • Relational operators: --str-lt, --str-gt, etc.
  • Case insensitive tests: --istr-eq, --istr-in-fld, etc.
  • Regular expressions: --regex, --not-regex, etc.
  • Field length: --char-len-lt, --byte-len-gt, etc.

The earlier --not-empty example uses a "field list". Fields lists specify a set of fields and can be used with most operators. For example, the following command ensures that fields 1-3 and 7 are less-than 100:

$ tsv-filter -H --lt 1-3,7:100 file.tsv

Field names can be used in field lists as well. The following command selects lines where both 'color' and 'count' fields are not empty:

$ tsv-filter -H messy.tsv --not-empty color,count

Field names can be matched using wildcards. The previous command could also be written as:

$ tsv-filter -H messy.tsv --not-empty 'co*'

The co* matches both the 'color' and 'count' fields. (Note: Single quotes are used to prevent the shell from interpreting the asterisk character.)

All TSV Utilities tools use the same syntax for specifying fields. See Field syntax in the Tools Reference document for details.

Bash completion is especially helpful with tsv-filter. It allows quickly seeing and selecting from the different operators available. See bash completion on the Tips and tricks page for setup information.

tsv-filter is perhaps the most broadly applicable of the TSV Utilities tools, as dataset pruning is such a common task. It is stream oriented, so it can handle arbitrarily large files. It is fast, quite a bit faster than other tools the author has tried. (See the "Numeric row filter" and "Regular expression row filter" tests in the 2018 Benchmark Summary.)

This makes tsv-filter ideal for preparing data for applications like R and Pandas. It is also convenient for quickly answering simple questions about a dataset.

See the tsv-filter reference for more details and the full list of operators.

tsv-select

A version of the Unix cut utility with the ability to select fields by name, drop fields, and reorder fields. The following command writes the date and time fields from a pair of files to standard output:

$ tsv-select -H -f date,time file1.tsv file2.tsv

Fields can also be selected by field number:

$ tsv-select -f 4,2,9-11 file1.tsv file2.tsv

Fields can be listed more than once, and fields not specified can be selected as a group using --r|rest. Fields can be dropped using --e|exclude.

The --H|header option turns on header processing. This enables specifying fields by name. Only the header from the first file is retained when multiple input files are provided.

Examples:

$ # Output fields 2 and 1, in that order.
$ tsv-select -f 2,1 data.tsv

$ # Output the 'Name' and 'RecordNum' fields.
$ tsv-select -H -f Name,RecordNum data.tsv.

$ # Drop the first field, keep everything else.
$ tsv-select --exclude 1 file.tsv

$ # Drop the 'Color' field, keep everything else.
$ tsv-select -H --exclude Color file.tsv

$ # Move the 'RecordNum' field to the start of the line.
$ tsv-select -H -f RecordNum --rest last data.tsv

$ # Move field 1 to the end of the line.
$ tsv-select -f 1 --rest first data.tsv

$ # Output a range of fields in reverse order.
$ tsv-select -f 30-3 data.tsv

$ # Drop all the fields ending in '_time'
$ tsv-select -H -e '*_time' data.tsv

$ # Multiple files with header lines. Keep only one header.
$ tsv-select data*.tsv -H --fields 1,2,4-7,14

See the tsv-select reference for details on tsv-select. See Field syntax for more information on selecting fields by name.

tsv-uniq

Similar in spirit to the Unix uniq tool, tsv-uniq filters a dataset so there is only one copy of each unique line. tsv-uniq goes beyond Unix uniq in a couple ways. First, data does not need to be sorted. Second, equivalence can be based on a subset of fields rather than the full line.

tsv-uniq can also be run in 'equivalence class identification' mode, where lines with equivalent keys are marked with a unique id rather than filtered out. Another variant is 'number' mode, which generates line numbers grouped by the key.

tsv-uniq operates on the entire line when no fields are specified. This is a useful alternative to the traditional sort -u or sort | uniq paradigms for identifying unique lines in unsorted files, as it is quite a bit faster, especially when there are many duplicate lines. As a bonus, order of the input lines is retained.

Examples:

$ # Unique a file based on the full line.
$ tsv-uniq data.tsv

$ # Unique a file with fields 2 and 3 as the key.
$ tsv-uniq -f 2,3 data.tsv

$ # Unique a file using the 'RecordID' field as the key.
$ tsv-uniq -H -f RecordID data.tsv

An in-memory lookup table is used to record unique entries. This ultimately limits the data sizes that can be processed. The author has found that datasets with up to about 10 million unique entries work fine, but performance starts to degrade after that. Even then it remains faster than the alternatives.

See the tsv-uniq reference for details.

tsv-summarize

tsv-summarize performs statistical calculations on fields. For example, generating the sum or median of a field's values. Calculations can be run across the entire input or can be grouped by key fields. Consider the file data.tsv:

color   weight
red     6
red     5
blue    15
red     4
blue    10

Calculations of the sum and mean of the weight column is shown below. The first command runs calculations on all values. The second groups them by color.

$ tsv-summarize --header --sum weight --mean weight data.tsv
weight_sum  weight_mean
40          8

$ tsv-summarize --header --group-by color --sum weight --mean color data.tsv
color  weight_sum  weight_mean
red    15          5
blue   25          12.5

Multiple fields can be used as the --group-by key. The file's sort order does not matter, there is no need to sort in the --group-by order first. Fields can be specified either by name or field number, like other tsv-utils tools.

See the tsv-summarize reference for the list of statistical and other aggregation operations available.

tsv-sample

tsv-sample randomizes line order (shuffling) or selects random subsets of lines (sampling) from input data. Several methods are available, including shuffling, simple random sampling, weighted random sampling, Bernoulli sampling, and distinct sampling. Data can be read from files or standard input. These sampling methods are made available through several modes of operation:

  • Shuffling - The default mode of operation. All lines are read in and written out in random order. All orderings are equally likely.
  • Simple random sampling (--n|num N) - A random sample of N lines are selected and written out in random order. The --i|inorder option preserves the original input order.
  • Weighted random sampling (--n|num N, --w|weight-field F) - A weighted random sample of N lines are selected using weights from a field on each line. Output is in weighted selection order unless the --i|inorder option is used. Omitting --n|num outputs all lines in weighted selection order (weighted shuffling).
  • Sampling with replacement (--r|replace, --n|num N) - All lines are read in, then lines are randomly selected one at a time and written out. Lines can be selected multiple times. Output continues until N samples have been output.
  • Bernoulli sampling (--p|prob P) - A streaming form of sampling. Lines are read one at a time and selected for output using probability P. e.g. -p 0.1 specifies that 10% of lines should be included in the sample.
  • Distinct sampling (--k|key-fields F, --p|prob P) - Another streaming form of sampling. However, instead of each line being subject to an independent selection choice, lines are selected based on a key contained in each line. A portion of keys are randomly selected for output, with probability P. Every line containing a selected key is included in the output. Consider a query log with records consisting of triples. It may be desirable to sample records for one percent of the users, but include all records for the selected users.

tsv-sample is designed for large data sets. Streaming algorithms make immediate decisions on each line. They do not accumulate memory and can run on infinite length input streams. Both shuffling and sampling with replacement read the entire dataset all at once and are limited by available memory. Simple and weighted random sampling use reservoir sampling and only need to hold the specified sample size (--n|num) in memory. By default, a new random order is generated every run, but options are available for using the same randomization order over multiple runs. The random values assigned to each line can be printed, either to observe the behavior or to run custom algorithms on the results.

See the tsv-sample reference for further details.

tsv-join

Joins lines from multiple files based on a common key. One file, the 'filter' file, contains the records (lines) being matched. The other input files are scanned for matching records. Matching records are written to standard output, along with any designated fields from the filter file. In database parlance this is a hash semi-join. This is similar to the "stream-static" joins available in Spark Structured Streaming and "KStream-KTable" joins in Kafka. (The filter file plays the same role as the Spark static dataset or Kafka KTable.)

Example:

$ tsv-join -H --filter-file filter.tsv --key-fields Country,City --append-fields Population,Elevation data.tsv

This reads filter.tsv, creating a lookup table keyed on the Country and City fields. data.tsv is read, lines with a matching key are written to standard output with the Population and Elevation fields from filter.tsv appended. This is an inner join. Left outer joins and anti-joins are also supported.

Common uses for tsv-join are to join related datasets or to filter one dataset based on another. Filter file entries are kept in memory, this limits the ultimate size that can be handled effectively. The author has found that filter files up to about 10 million lines are processed effectively, but performance starts to degrade after that.

See the tsv-join reference for details.

tsv-pretty

tsv-pretty prints TSV data in an aligned format for better readability when working on the command-line. Text columns are left aligned, numeric columns are right aligned. Floats are aligned on the decimal point and precision can be specified. Header lines are detected automatically. If desired, the header line can be repeated at regular intervals. An example, first printed without formatting:

$ cat sample.tsv
Color   Count   Ht      Wt
Brown   106     202.2   1.5
Canary Yellow   7       106     0.761
Chartreuse	1139	77.02   6.22
Fluorescent Orange	422     1141.7  7.921
Grey	19	140.3	1.03

Now with tsv-pretty, using header underlining and float formatting:

$ tsv-pretty -u -f sample.tsv
Color               Count       Ht     Wt
-----               -----       --     --
Brown                 106   202.20  1.500
Canary Yellow           7   106.00  0.761
Chartreuse           1139    77.02  6.220
Fluorescent Orange    422  1141.70  7.921
Grey                   19   140.30  1.030

See the tsv-pretty reference for details.

csv2tsv

csv2tsv does what you expect: convert CSV data to TSV. Example:

$ csv2tsv data.csv > data.tsv

A strict delimited format like TSV has many advantages for data processing over an escape oriented format like CSV. However, CSV is a very popular data interchange format and the default export format for many database and spreadsheet programs. Converting CSV files to TSV allows them to be processed reliably by both this toolkit and standard Unix utilities like awk and sort.

Note that many CSV files do not use escapes, and in-fact follow a strict delimited format using comma as the delimiter. Such files can be processed reliably by this toolkit and Unix tools by specifying the delimiter character. However, when there is doubt, using a csv2tsv converter adds reliability.

csv2tsv differs from many csv-to-tsv conversion tools in that it produces output free of CSV escapes. Many conversion tools produce data with CSV style escapes, but switching the field delimiter from comma to TAB. Such data cannot be reliably processed by Unix tools like cut, awk, sort, etc.

csv2tsv avoids escapes by replacing TAB and newline characters in the data with a single space. These characters are rare in data mining scenarios, and space is usually a good substitute in cases where they do occur. The replacement strings are customizable to enable alternate handling when needed.

The csv2tsv converter often has a second benefit: regularizing newlines. CSV files are often exported using Windows newline conventions. csv2tsv converts all newlines to Unix format.

See Comparing TSV and CSV formats for more information on CSV escapes and other differences between CSV and TSV formats.

There are many variations of CSV file format. See the csv2tsv reference for details of the format variations supported by this tool.

tsv-split

tsv-split is used to split one or more input files into multiple output files. There are three modes of operation:

  • Fixed number of lines per file (--l|lines-per-file NUM): Each input block of NUM lines is written to a new file. This is similar to the Unix split utility.

  • Random assignment (--n|num-files NUM): Each input line is written to a randomly selected output file. Random selection is from NUM files.

  • Random assignment by key (--n|num-files NUM, --k|key-fields FIELDS): Input lines are written to output files using fields as a key. Each unique key is randomly assigned to one of NUM output files. All lines with the same key are written to the same file.

By default, files are written to the current directory and have names of the form part_NNN , with NNN being a number and being the extension of the first input file. If the input file is file.txt, the names will take the form part_NNN.txt. The output directory and file names are customizable.

Examples:

$ # Split a file into files of 10,000 lines each. Output files
$ # are written to the 'split_files/' directory.
$ tsv-split data.txt --lines-per-file 10000 --dir split_files

$ # Split a file into 1000 files with lines randomly assigned.
$ tsv-split data.txt --num-files 1000 --dir split_files

# Randomly assign lines to 1000 files using field 3 as a key.
$ tsv-split data.tsv --num-files 1000 -key-fields 3 --dir split_files

See the tsv-split reference for more information.

tsv-append

tsv-append concatenates multiple TSV files, similar to the Unix cat utility. It is header-aware, writing the header from only the first file. It also supports source tracking, adding a column indicating the original file to each row.

Concatenation with header support is useful when preparing data for traditional Unix utilities like sort and sed or applications that read a single file.

Source tracking is useful when creating long/narrow form tabular data. This format is used by many statistics and data mining packages. (See Wide & Long Data - Stanford University or Hadley Wickham's Tidy data for more info.)

In this scenario, files have been used to capture related data sets, the difference between data sets being a condition represented by the file. For example, results from different variants of an experiment might each be recorded in their own files. Retaining the source file as an output column preserves the condition represented by the file. The source values default to the file names, but this can be customized.

See the tsv-append reference for the complete list of options available.

number-lines

A simpler version of the Unix nl program. It prepends a line number to each line read from files or standard input. This tool was written primarily as an example of a simple command line tool. The code structure it uses is the same as followed by all the other tools. Example:

$ number-lines myfile.txt

Despite its original purpose as a code sample, number-lines turns out to be quite convenient. It is often useful to add a unique row ID to a file, and this tool does this in a manner that maintains proper TSV formatting.

See the number-lines reference for details.

keep-header

A convenience utility that runs Unix commands in a header-aware fashion. It is especially useful with sort. sort does not know about headers, so the header line ends up wherever it falls in the sort order. Using keep-header, the header line is output first and the rest of the sorted file follows. For example:

$ # Sort a file, keeping the header line at the top.
$ keep-header myfile.txt -- sort

The command to run is placed after the double dash (--). Everything after the initial double dash is part of the command. For example, sort --ignore-case is run as follows:

$ # Case-insensitive sort, keeping the header line at the top.
$ keep-header myfile.txt -- sort --ignore-case

Multiple files can be provided, only the header from the first is retained. For example:

$ # Sort a set of files in reverse order, keeping only one header line.
$ keep-header *.txt -- sort -r

keep-header is especially useful for commands like sort and shuf that reorder input lines. It is also useful with filtering commands like grep, many awk uses, and even tail, where the header should be retained without filtering or evaluation.

Examples:

$ # 'grep' a file, keeping the header line without needing to match it.
$ keep-header file.txt -- grep 'some text'

$ # Print the last 10 lines of a file, but keep the header line
$ keep-header file.txt -- tail

$ # Print lines 100-149 of a file, plus the header
$ keep-header file.txt -- tail -n +100 | head -n 51

$ # Sort a set of TSV files numerically on field 2, keeping one header.
$ keep-header *.tsv -- sort -t $'\t' -k2,2n

$ # Same as the previous example, but using the 'tsv-sort-fast' bash
$ # script described on the "Tips and Tricks" page.
$ keep-header *.tsv -- tsv-sort-fast -k2,2n

See the keep-header reference for more information.


Obtaining and installation

There are several ways to obtain the tools: prebuilt binaries; building from source code; and installing using the DUB package manager.

The tools are tested on Linux and MacOS. Windows users are encouraged to use either Windows Subsystem for Linux (WSL) or Docker for Windows and run Linux builds of the tools. See issue #317 for the status of Windows builds.

Prebuilt binaries

Prebuilt binaries are available for Linux and Mac, these can be found on the Github releases page. Download and unpack the tar.gz file. Executables are in the bin directory. Add the bin directory or individual tools to the PATH environment variable. As an example, the 2.2.0 releases for Linux and MacOS can be downloaded and unpacked with these commands:

$ curl -L https://github.com/eBay/tsv-utils/releases/download/v2.2.0/tsv-utils-v2.2.0_linux-x86_64_ldc2.tar.gz | tar xz
$ curl -L https://github.com/eBay/tsv-utils/releases/download/v2.2.0/tsv-utils-v2.2.0_osx-x86_64_ldc2.tar.gz | tar xz

See the Github releases page for the latest release.

For some distributions a package can directly be installed:

Distribution Command
Arch Linux pacaur -S tsv-utils (see tsv-utils)

Note: The distributions above are not updated as frequently as the Github releases page.

Build from source files

Download a D compiler. These tools have been tested with the DMD and LDC compilers on MacOS and Linux. Use DMD version 2.088.1 or later, LDC version 1.18.0 or later.

Clone this repository, select a compiler, and run make from the top level directory:

$ git clone https://github.com/eBay/tsv-utils.git
$ cd tsv-utils
$ make         # For LDC: make DCOMPILER=ldc2

Executables are written to tsv-utils/bin, place this directory or the executables in the PATH. The compiler defaults to DMD, this can be changed on the make command line (e.g. make DCOMPILER=ldc2). DMD is the reference compiler, but LDC produces faster executables. (For some tools LDC is quite a bit faster than DMD.)

The makefile supports other typical development tasks such as unit tests and code coverage reports. See Building and makefile for more details.

For fastest performance, use LDC with Link Time Optimization (LTO) and Profile Guided Optimization (PGO) enabled:

$ git clone https://github.com/eBay/tsv-utils.git
$ cd tsv-utils
$ make DCOMPILER=ldc2 LDC_LTO_RUNTIME=1 LDC_PGO=2
$ # Run the test suite
$ make test-nobuild DCOMPILER=ldc2

The above requires LDC 1.9.0 or later. See Building with Link Time Optimization for more information. The prebuilt binaries are built using LTO and PGO, but these must be explicitly enabled when building from source. LTO and PGO are still early stage technologies, issues may surface in some system configurations. Running the test suite (shown above) is a good way to detect issues that may arise.

Install using DUB

If you are a D user you likely use DUB, the D package manager. DUB comes packaged with DMD starting with DMD 2.072. You can install and build using DUB as follows (replace 2.2.0 with the current version):

$ dub fetch tsv-utils --cache=local
$ cd tsv-utils-2.2.0/tsv-utils
$ dub run    # For LDC: dub run -- --compiler=ldc2

The dub run command compiles all the tools. The executables are written to tsv-utils/bin. Add this directory or individual executables to the PATH.

See Building and makefile for more information about the DUB setup.

The applications can be built with LTO and PGO when source code is fetched by DUB. However, the DUB build system does not support this. make must be used instead. See Building with Link Time Optimization.

Setup customization

There are a number of simple ways to improve the utility of these tools, these are listed on the Tips and tricks page. Bash aliases, Unix sort command customization, and bash completion are especially useful.

Issues
  • Issue with installing on Windows 10 using D / build failure

    Issue with installing on Windows 10 using D / build failure

    The build fails to install tsv-utils on "tsv-split" step. It installs the programs before this one, fails on this one and quits. thank you

    D for win error

    fixed/done Windows 
    opened by AnnaBanana90210 28
  • Bulding tsv-utils with LTO and PGO on Archlinux

    Bulding tsv-utils with LTO and PGO on Archlinux

    Hi,

    As per our conversation, building tsv-utils with LTO and PGO on Archlinux fails. Below is the output for trying to compile current master with just LTO.

    $ make DCOMPILER=ldc2 LDC_LTO_RUNTIME=1
    
    make -C common 
    make[1]: Entering directory '/tmp/tsv-utils/common'
    make[1]: 'release' is up to date.
    make[1]: Leaving directory '/tmp/tsv-utils/common'
    
    make -C csv2tsv 
    make[1]: Entering directory '/tmp/tsv-utils/csv2tsv'
    ldc2 -release -O3 -boundscheck=off -singleobj -flto=thin -odobj  -defaultlib=phobos2-ldc-lto,druntime-ldc-lto  -of/tmp/tsv-utils/bin/csv2tsv -I/tmp/tsv-utils/common/src/tsv_utils/common /tmp/tsv-utils/csv2tsv/src/tsv_utils/csv2tsv.d /tmp/tsv-utils/common/src/tsv_utils/common/utils.d /tmp/tsv-utils/common/src/tsv_utils/common/numerics.d /tmp/tsv-utils/common/src/tsv_utils/common/fieldlist.d /tmp/tsv-utils/common/src/tsv_utils/common/getopt_inorder.d /tmp/tsv-utils/common/src/tsv_utils/common/unittest_utils.d /tmp/tsv-utils/common/src/tsv_utils/common/tsvutils_version.d
    /usr/bin/ld.gold: error: cannot find -lphobos2-ldc-lto-shared
    /usr/bin/ld.gold: error: cannot find -ldruntime-ldc-lto-shared
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function ldc.register_dso: error: undefined reference to '_d_dso_registry'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPbZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_D3std6getopt12endOfOptionsAya'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPbZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_D3std6getopt12endOfOptionsAya'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPbZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_D3std6getopt13configuration20stopOnFirstNonOptionMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPbZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_D3std6getopt10optionCharw'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPbZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_D3std6getopt13configuration8bundlingMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPbZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_D3std6getopt10optionCharw'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPbZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_D3std6getopt8optMatchFNfAyaMQeKQhSQBhQBg13configurationZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPbZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_d_arraycatT'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPbZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_D3std5ascii7isUpperFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPbZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_D3std5ascii7isUpperFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPbZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_D3std5range10primitives__T5emptyTAyaZQlFNaNbNdNiNfMKQtZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPbZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_aApplycd2'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPbZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_d_arraycatnTX'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPbZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_D3std4conv10parseErrorFNaNfLAyaQdmZCQBjQBi13ConvException'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPbZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_d_throw_exception'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPbZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_d_eh_enter_catch'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPbZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_d_throw_exception'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPbZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_D3std5range10primitives__T5emptyTAyaZQlFNaNbNdNiNfMKQtZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPbZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_d_throw_exception'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPbZQsFAyaQjKAQhKSQBuQBt13configurationbZ14__foreachbody6MFNfKmKwZi: error: undefined reference to '_D3std5ascii7isAlphaFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPbZQsFAyaQjKAQhKSQBuQBt13configurationbZ14__foreachbody6MFNfKmKwZi: error: undefined reference to '_D3std6getopt10optionCharw'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPbZQsFAyaQjKAQhKSQBuQBt13configurationbZ14__foreachbody6MFNfKmKwZi: error: undefined reference to '_d_arrayappendcTX'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPbZQsFAyaQjKAQhKSQBuQBt13configurationbZ14__foreachbody6MFNfKmKwZi: error: undefined reference to '_d_arrayappendcTX'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPaZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_D3std6getopt12endOfOptionsAya'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPaZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_D3std6getopt12endOfOptionsAya'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPaZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_D3std6getopt13configuration20stopOnFirstNonOptionMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPaZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_D3std6getopt10optionCharw'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPaZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_D3std6getopt13configuration8bundlingMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPaZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_D3std6getopt8optMatchFNfAyaMQeKQhSQBhQBg13configurationZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPaZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_d_arraycatT'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPaZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_D3std9exception__T7enforceZ__TQmTbZQrFNaNfbLAxaAyamZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPaZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_d_arraycatT'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPaZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_D3std5range10primitives__T5emptyTAyaZQlFNaNbNdNiNfMKQtZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPaZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_D3std5range10primitives__T5emptyTAyaZQlFNaNbNdNiNfMKQtZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPaZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_aApplycd2'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPaZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_d_arraycatnTX'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPaZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_d_throw_exception'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPaZQsFNfAyaQlKAQhKSQBwQBv13configurationbZb: error: undefined reference to '_d_eh_enter_catch'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPaZQsFAyaQjKAQhKSQBuQBt13configurationbZ14__foreachbody6MFNfKmKwZi: error: undefined reference to '_D3std5ascii7isAlphaFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPaZQsFAyaQjKAQhKSQBuQBt13configurationbZ14__foreachbody6MFNfKmKwZi: error: undefined reference to '_d_arrayappendcTX'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPaZQsFAyaQjKAQhKSQBuQBt13configurationbZ14__foreachbody6MFNfKmKwZi: error: undefined reference to '_d_arrayappendcTX'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPaZQsFAyaQjKAQhKSQBuQBt13configurationbZ12__dgliteral7MFNaNbNfZAxa: error: undefined reference to '_D12TypeInfo_Axa6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPaZQsFAyaQjKAQhKSQBuQBt13configurationbZ12__dgliteral7MFNaNbNfZAxa: error: undefined reference to '_d_arraycatnTX'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPAyaZQuFNfQjQmKAQpKSQBxQBw13configurationbZb: error: undefined reference to '_D3std6getopt13configuration20stopOnFirstNonOptionMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPAyaZQuFNfQjQmKAQpKSQBxQBw13configurationbZb: error: undefined reference to '_D3std6getopt13configuration8bundlingMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPAyaZQuFNfQjQmKAQpKSQBxQBw13configurationbZb: error: undefined reference to '_D3std6getopt8optMatchFNfAyaMQeKQhSQBhQBg13configurationZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPAyaZQuFNfQjQmKAQpKSQBxQBw13configurationbZb: error: undefined reference to '_d_arraycatT'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPAyaZQuFNfQjQmKAQpKSQBxQBw13configurationbZb: error: undefined reference to '_D3std9exception__T7enforceZ__TQmTbZQrFNaNfbLAxaAyamZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPAyaZQuFNfQjQmKAQpKSQBxQBw13configurationbZb: error: undefined reference to '_aApplycd2'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPAyaZQuFNfQjQmKAQpKSQBxQBw13configurationbZb: error: undefined reference to '_d_arraycatnTX'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPAyaZQuFQhQkKAQnKSQBvQBu13configurationbZ14__foreachbody6MFNfKmKwZi: error: undefined reference to '_D3std5ascii7isAlphaFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6getopt__T12handleOptionTPAyaZQuFQhQkKAQnKSQBvQBu13configurationbZ12__dgliteral7MFNaNbNfZAxa: error: undefined reference to '_D12TypeInfo_Axa6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std4conv__T4textTAyaTxaZQnFNaNbNfQqxaZQv: error: undefined reference to '_D3std5array__T8appenderTAyaZQoFNaNbNfZSQBmQBl__T8AppenderTQBiZQo'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std3utf__T6encodeVEQu8typecons__T4FlagVAyaa19_7573655265706c6163656d656e744463686172ZQCai0ZQDdFNaNfJG4awZm: error: undefined reference to '_D3std3utf12UTFException7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std3utf__T6encodeVEQu8typecons__T4FlagVAyaa19_7573655265706c6163656d656e744463686172ZQCai0ZQDdFNaNfJG4awZm: error: undefined reference to '_d_allocclass'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std3utf__T6encodeVEQu8typecons__T4FlagVAyaa19_7573655265706c6163656d656e744463686172ZQCai0ZQDdFNaNfJG4awZm: error: undefined reference to '_D3std3utf12UTFException6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std3utf__T6encodeVEQu8typecons__T4FlagVAyaa19_7573655265706c6163656d656e744463686172ZQCai0ZQDdFNaNfJG4awZm: error: undefined reference to '_D3std3utf12UTFException6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std3utf__T6encodeVEQu8typecons__T4FlagVAyaa19_7573655265706c6163656d656e744463686172ZQCai0ZQDdFNaNfJG4awZm: error: undefined reference to '_D3std3utf12UTFException7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std3utf__T6encodeVEQu8typecons__T4FlagVAyaa19_7573655265706c6163656d656e744463686172ZQCai0ZQDdFNaNfJG4awZm: error: undefined reference to '_d_allocclass'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std3utf__T6encodeVEQu8typecons__T4FlagVAyaa19_7573655265706c6163656d656e744463686172ZQCai0ZQDdFNaNfJG4awZm: error: undefined reference to '_D3std3utf12UTFException6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std3utf__T6encodeVEQu8typecons__T4FlagVAyaa19_7573655265706c6163656d656e744463686172ZQCai0ZQDdFNaNfJG4awZm: error: undefined reference to '_D3std3utf12UTFException6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std3utf__T6encodeVEQu8typecons__T4FlagVAyaa19_7573655265706c6163656d656e744463686172ZQCai0ZQDdFNaNfJG4awZm: error: undefined reference to '_D3std3utf12UTFException6__ctorMFNaNbNiNfAyaQdmC6object9ThrowableZCQCnQCmQCl'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D9tsv_utils6common5utils11InputSource11__fieldDtorMFNeZv: error: undefined reference to '_D3std5stdio4File6__dtorMFNfZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5array__T8AppenderTAyaZQo13ensureAddableMFNaNbNfmZv: error: undefined reference to '_d_newitemT'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5array__T8AppenderTAyaZQo13ensureAddableMFNaNbNfmZv: error: undefined reference to '_D4core6memory2GC6extendFNaNbPvmmxC8TypeInfoZm'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5array__T8AppenderTAyaZQo13ensureAddableMFNaNbNfmZv: error: undefined reference to '_D4core6memory2GC6qallocFNaNbmkxC8TypeInfoZSQBqQBo8BlkInfo_'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File17LockingTextWriter__T3putTAyaZQjMFNfMQlZv: error: undefined reference to '_D3std5stdio4File17LockingTextWriter26highSurrogateShouldBeEmptyMFNfZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File17LockingTextWriter__T3putTAyaZQjMFNfMQlZv: error: undefined reference to '_D3std5stdio4File17LockingTextWriter7handle_MFNdNeZPS4core4stdcQCf8_IO_FILE'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File17LockingTextWriter__T3putTAyaZQjMFNfMQlZv: error: undefined reference to '_D3std9exception14ErrnoException7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File17LockingTextWriter__T3putTAyaZQjMFNfMQlZv: error: undefined reference to '_d_allocclass'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File17LockingTextWriter__T3putTAyaZQjMFNfMQlZv: error: undefined reference to '_D3std9exception14ErrnoException6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File17LockingTextWriter__T3putTAyaZQjMFNfMQlZv: error: undefined reference to '_D3std9exception14ErrnoException6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File17LockingTextWriter__T3putTAyaZQjMFNfMQlZv: error: undefined reference to '_D3std9exception14ErrnoException6__ctorMFNfAyaQdmZCQBxQBwQBp'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8writeflnTaTAyaTQeZQtMFNfIAaQqQsZv: error: undefined reference to '_D3std5stdio4File17lockingTextWriterMFNfZSQBoQBnQBk17LockingTextWriter'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8writeflnTaTAyaTQeZQtMFNfIAaQqQsZv: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8writeflnTaTAyaTQeZQtMFNfIAaQqQsZv: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp6__ctorMFNaNbNcNiNfIAaZSQCdQCc__TQByTaZQCe'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8writeflnTaTAyaTQeZQtMFNfIAaQqQsZv: error: undefined reference to '_D3std6format__T9getNthIntVAyaa13_696e7465676572207769647468TQBiTQBmZQCbFNaNfkQBzQCcZi'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8writeflnTaTAyaTQeZQtMFNfIAaQqQsZv: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp6flDashMFNaNbNdNiNfbZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8writeflnTaTAyaTQeZQtMFNfIAaQqQsZv: error: undefined reference to '_D3std6format__T9getNthIntVAyaa17_696e746567657220707265636973696f6eTQBqTQBuZQCjFNaNfkQChQCkZi'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8writeflnTaTAyaTQeZQtMFNfIAaQqQsZv: error: undefined reference to '_D3std6format__T9getNthIntVAyaa13_696e7465676572207769647468TQBiTQBmZQCbFNaNfkQBzQCcZi'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8writeflnTaTAyaTQeZQtMFNfIAaQqQsZv: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp6flDashMFNaNbNdNiNfbZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8writeflnTaTAyaTQeZQtMFNfIAaQqQsZv: error: undefined reference to '_D3std6format__T9getNthIntVAyaa17_696e746567657220707265636973696f6eTQBqTQBuZQCjFNaNfkQChQCkZi'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8writeflnTaTAyaTQeZQtMFNfIAaQqQsZv: error: undefined reference to '_D3std6format__T9getNthIntVAyaa21_736570617261746f72206469676974207769647468TQByTQCcZQCrFNaNfkQCpQCsZi'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8writeflnTaTAyaTQeZQtMFNfIAaQqQsZv: error: undefined reference to '_D3std6format__T6getNthVAyaa19_736570617261746f7220636861726163746572SQCq6traits10isSomeCharTwTQCtTQCxZQDjFNaNfkQDkQDnZw'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8writeflnTaTAyaTQeZQtMFNfIAaQqQsZv: error: undefined reference to '_D3std9exception__T7enforceHTCQBc6format15FormatExceptionZ__TQBqTbZQBwFNaNfbLAxaAyamZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8writeflnTaTAyaTQeZQtMFNfIAaQqQsZv: error: undefined reference to '_D3std9exception__T7enforceHTCQBc6format15FormatExceptionZ__TQBqTbZQBwFNaNfbLAxaAyamZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8writeflnTaTAyaTQeZQtMFNfIAaQqQsZv: error: undefined reference to '_D3std5stdio4File17LockingTextWriter26highSurrogateShouldBeEmptyMFNfZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8writeflnTaTAyaTQeZQtMFNfIAaQqQsZv: error: undefined reference to '_D3std5stdio4File17LockingTextWriter7handle_MFNdNeZPS4core4stdcQCf8_IO_FILE'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8writeflnTaTAyaTQeZQtMFNfIAaQqQsZv: error: undefined reference to '_D3std5stdio4File17LockingTextWriter10__aggrDtorMFNeZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8writeflnTaTAyaTQeZQtMFNfIAaQqQsZv: error: undefined reference to '_D3std6format15FormatException7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8writeflnTaTAyaTQeZQtMFNfIAaQqQsZv: error: undefined reference to '_d_allocclass'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8writeflnTaTAyaTQeZQtMFNfIAaQqQsZv: error: undefined reference to '_D3std6format15FormatException6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8writeflnTaTAyaTQeZQtMFNfIAaQqQsZv: error: undefined reference to '_D3std6format15FormatException6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8writeflnTaTAyaTQeZQtMFNfIAaQqQsZv: error: undefined reference to '_D3std4conv__T4textTAyaThTaTaTQkTmZQvFNaNbNfQyhaaQBdmZQBi'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8writeflnTaTAyaTQeZQtMFNfIAaQqQsZv: error: undefined reference to '_D3std6format15FormatException6__ctorMFNaNbNiNfAyaQdmC6object9ThrowableZCQCtQCsQCo'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8writeflnTaTAyaTQeZQtMFNfIAaQqQsZv: error: undefined reference to '_D3std5stdio4File17LockingTextWriter10__aggrDtorMFNeZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File17LockingTextWriter__T3putTAxaZQjMFNfMQlZv: error: undefined reference to '_D3std5stdio4File17LockingTextWriter26highSurrogateShouldBeEmptyMFNfZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File17LockingTextWriter__T3putTAxaZQjMFNfMQlZv: error: undefined reference to '_D3std5stdio4File17LockingTextWriter7handle_MFNdNeZPS4core4stdcQCf8_IO_FILE'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File17LockingTextWriter__T3putTAxaZQjMFNfMQlZv: error: undefined reference to '_D3std9exception14ErrnoException7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File17LockingTextWriter__T3putTAxaZQjMFNfMQlZv: error: undefined reference to '_D3std9exception14ErrnoException6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File17LockingTextWriter__T3putTAxaZQjMFNfMQlZv: error: undefined reference to '_D3std9exception14ErrnoException6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File17LockingTextWriter__T3putTAxaZQjMFNfMQlZv: error: undefined reference to '_D3std9exception14ErrnoException6__ctorMFNfAyaQdmZCQBxQBwQBp'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File17LockingTextWriter__T3putTxwZQiMFNfxwZv: error: undefined reference to '_D3std5stdio4File17LockingTextWriter26highSurrogateShouldBeEmptyMFNfZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File17LockingTextWriter__T3putTxwZQiMFNfxwZv: error: undefined reference to '_D3std5stdio4File17LockingTextWriter7handle_MFNdNeZPS4core4stdcQCf8_IO_FILE'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8rawWriteTaZQmMFNfIAaZv: error: undefined reference to '_D3std5array__T8appenderTAyaZQoFNaNbNfZSQBmQBl__T8AppenderTQBiZQo'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8rawWriteTaZQmMFNfIAaZv: error: undefined reference to '_D11TypeInfo_Aa6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8rawWriteTaZQmMFNfIAaZv: error: undefined reference to '_d_newarrayU'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8rawWriteTaZQmMFNfIAaZv: error: undefined reference to '_D11TypeInfo_Aa6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8rawWriteTaZQmMFNfIAaZv: error: undefined reference to '_d_newarrayU'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8rawWriteTaZQmMFNfIAaZv: error: undefined reference to '_D3std9exception14ErrnoException7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8rawWriteTaZQmMFNfIAaZv: error: undefined reference to '_D3std9exception14ErrnoException6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8rawWriteTaZQmMFNfIAaZv: error: undefined reference to '_D3std9exception14ErrnoException6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8rawWriteTaZQmMFNfIAaZv: error: undefined reference to '_D12TypeInfo_Axa6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8rawWriteTaZQmMFNfIAaZv: error: undefined reference to '_d_newarrayU'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5stdio4File__T8rawWriteTaZQmMFNfIAaZv: error: undefined reference to '_D3std9exception14ErrnoException6__ctorMFNfAyaQdmZCQBxQBwQBp'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5array__T8AppenderTAaZQn13ensureAddableMFNaNbNfmZv: error: undefined reference to '_d_newitemT'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5array__T8AppenderTAaZQn13ensureAddableMFNaNbNfmZv: error: undefined reference to '_D4core6memory2GC6extendFNaNbPvmmxC8TypeInfoZm'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std5array__T8AppenderTAaZQn13ensureAddableMFNaNbNfmZv: error: undefined reference to '_D4core6memory2GC6qallocFNaNbmkxC8TypeInfoZSQBqQBo8BlkInfo_'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std4path14isDirSeparatorFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std4path14isDirSeparatorFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std4path14isDirSeparatorFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std4path14isDirSeparatorFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt11splitAndGetFNaNbNeAyaZSQBkQBj6Option'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt13configuration8requiredMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_aaGetY'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_aaGetY'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt13configuration8requiredMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt15GetOptException7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt15GetOptException6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt15GetOptException6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D12TypeInfo_Aya6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt15GetOptException8__mixin16__ctorMFNaNbNiNfAyaC6object9ThrowableQvmZCQDcQDbQCx'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt13configuration8requiredMFNaNbNdNiNfbZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt9setConfigFNaNbNiNfKSQBgQBf13configurationEQCcQCb6configZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt11splitAndGetFNaNbNeAyaZSQBkQBj6Option'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt13configuration8requiredMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_aaGetY'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_aaGetY'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt13configuration8requiredMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt15GetOptException7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt15GetOptException6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt15GetOptException6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D12TypeInfo_Aya6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt15GetOptException8__mixin16__ctorMFNaNbNiNfAyaC6object9ThrowableQvmZCQDcQDbQCx'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt13configuration8requiredMFNaNbNdNiNfbZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt9setConfigFNaNbNiNfKSQBgQBf13configurationEQCcQCb6configZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt11splitAndGetFNaNbNeAyaZSQBkQBj6Option'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt15GetOptException7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt15GetOptException6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt15GetOptException6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D12TypeInfo_Aya6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt15GetOptException8__mixin16__ctorMFNaNbNiNfAyaC6object9ThrowableQvmZCQDcQDbQCx'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt13configuration8requiredMFNaNbNdNiNfbZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt11splitAndGetFNaNbNeAyaZSQBkQBj6Option'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt15GetOptException7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt15GetOptException6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt15GetOptException6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D12TypeInfo_Aya6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt15GetOptException8__mixin16__ctorMFNaNbNiNfAyaC6object9ThrowableQvmZCQDcQDbQCx'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt13configuration8requiredMFNaNbNdNiNfbZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt9setConfigFNaNbNiNfKSQBgQBf13configurationEQCcQCb6configZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt9setConfigFNaNbNiNfKSQBgQBf13configurationEQCcQCb6configZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt13configuration11passThroughMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt13configuration20stopOnFirstNonOptionMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt20defaultGetoptPrinterFAyaASQBnQBm6OptionZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt20defaultGetoptPrinterFAyaASQBnQBm6OptionZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio13trustedStdoutFNdNeZSQBgQBf4File'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio4File17lockingTextWriterMFNfZSQBoQBnQBk17LockingTextWriter'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio4File6__dtorMFNfZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std6getopt13configuration16keepEndOfOptionsMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std9exception__T7enforceZ__TQmTbZQrFNaNfbLAxaAyamZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std9exception__T7enforceZ__TQmTbZQrFNaNfbLAxaAyamZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio4File17LockingTextWriter10__aggrDtorMFNeZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio__T10makeGlobalVEQBbQBa13StdFileHandlea22_636f72652e737464632e737464696f2e7374646f7574ZQDgFNbNcNdNiZSQEhQEg4File'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio4File10__postblitMFNbNfZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio4File10__postblitMFNbNfZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio4File6__dtorMFNfZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio__T10makeGlobalVEQBbQBa13StdFileHandlea21_636f72652e737464632e737464696f2e737464696eZQDeFNbNcNdNiZSQEfQEe4File'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio4File10__postblitMFNbNfZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio4File6__ctorMFNcNfAyaMAxaZSQBlQBkQBh'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio4File10__postblitMFNbNfZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio4File7byChunkMFAhZSQBdQBcQz11ByChunkImpl'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio4File6__dtorMFNfZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio4File11ByChunkImpl15__fieldPostblitMFNbNeZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio4File11ByChunkImpl11__fieldDtorMFNeZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio4File11ByChunkImpl5emptyMxFNbNdZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio4File11ByChunkImpl5frontMFNbNdZAh'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio4File11ByChunkImpl8popFrontMFZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio4File11ByChunkImpl5emptyMxFNbNdZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio4File11ByChunkImpl11__fieldDtorMFNeZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D9Exception7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D9Exception6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D9Exception6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5array__T8appenderTAyaZQoFNaNbNfZSQBmQBl__T8AppenderTQBiZQo'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std9exception__T7enforceHTCQBc6format15FormatExceptionZ__TQBqTbZQBwFNaNfbLAxaAyamZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D6object9Exception6__ctorMFNaNbNiNfAyaQdmCQBp9ThrowableZCQBx'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D9Exception7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D9Exception6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D9Exception6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D12TypeInfo_Axa6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_d_newarrayU'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D6object9Exception6__ctorMFNaNbNiNfAyaQdmCQBp9ThrowableZCQBx'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio4File17LockingTextWriter10__aggrDtorMFNeZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_d_eh_enter_catch'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio13trustedStdoutFNdNeZSQBgQBf4File'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio__T10makeGlobalVEQBbQBa13StdFileHandlea21_636f72652e737464632e737464696f2e737464696eZQDeFNbNcNdNiZSQEfQEe4File'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio4File5flushMFNeZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio__T10makeGlobalVEQBbQBa13StdFileHandlea22_636f72652e737464632e737464696f2e737464657272ZQDgFNbNcNdNiZSQEhQEg4File'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_d_eh_enter_catch'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _Dmain: error: undefined reference to '_D3std5stdio__T10makeGlobalVEQBbQBa13StdFileHandlea22_636f72652e737464632e737464696f2e737464657272ZQDgFNbNcNdNiZSQEhQEg4File'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function main: error: undefined reference to '_d_run_main'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std3utf__T10decodeImplVbi1VEQBd8typecons__T4FlagVAyaa19_7573655265706c6163656d656e744463686172ZQCai0TAxaZQDrFNaKQlKmZw: error: undefined reference to '_D3std3utf12isValidDcharFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std3utf__T10decodeImplVbi1VEQBd8typecons__T4FlagVAyaa19_7573655265706c6163656d656e744463686172ZQCai0TAxaZQDrFKQjKmZ10invalidUTFMFNaNbZCQFgQFf12UTFException: error: undefined reference to '_D3std3utf12UTFException7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std3utf__T10decodeImplVbi1VEQBd8typecons__T4FlagVAyaa19_7573655265706c6163656d656e744463686172ZQCai0TAxaZQDrFKQjKmZ10invalidUTFMFNaNbZCQFgQFf12UTFException: error: undefined reference to '_D3std3utf12UTFException6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std3utf__T10decodeImplVbi1VEQBd8typecons__T4FlagVAyaa19_7573655265706c6163656d656e744463686172ZQCai0TAxaZQDrFKQjKmZ10invalidUTFMFNaNbZCQFgQFf12UTFException: error: undefined reference to '_D3std3utf12UTFException6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std3utf__T10decodeImplVbi1VEQBd8typecons__T4FlagVAyaa19_7573655265706c6163656d656e744463686172ZQCai0TAxaZQDrFKQjKmZ10invalidUTFMFNaNbZCQFgQFf12UTFException: error: undefined reference to '_D3std3utf12UTFException6__ctorMFNaNbNfAyamQemC6object9ThrowableZCQCmQClQCk'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std3utf__T10decodeImplVbi1VEQBd8typecons__T4FlagVAyaa19_7573655265706c6163656d656e744463686172ZQCai0TAxaZQDrFKQjKmZ11outOfBoundsMFNaNbZCQFhQFg12UTFException: error: undefined reference to '_D3std3utf12UTFException7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std3utf__T10decodeImplVbi1VEQBd8typecons__T4FlagVAyaa19_7573655265706c6163656d656e744463686172ZQCai0TAxaZQDrFKQjKmZ11outOfBoundsMFNaNbZCQFhQFg12UTFException: error: undefined reference to '_D3std3utf12UTFException6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std3utf__T10decodeImplVbi1VEQBd8typecons__T4FlagVAyaa19_7573655265706c6163656d656e744463686172ZQCai0TAxaZQDrFKQjKmZ11outOfBoundsMFNaNbZCQFhQFg12UTFException: error: undefined reference to '_D3std3utf12UTFException6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std3utf__T10decodeImplVbi1VEQBd8typecons__T4FlagVAyaa19_7573655265706c6163656d656e744463686172ZQCai0TAxaZQDrFKQjKmZ11outOfBoundsMFNaNbZCQFhQFg12UTFException: error: undefined reference to '_D3std3utf12UTFException6__ctorMFNaNbNfAyamQemC6object9ThrowableZCQCmQClQCk'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std4conv__T8textImplTAyaTwTwZQsFNaNfwwZQs: error: undefined reference to '_D3std5array__T8appenderTAyaZQoFNaNbNfZSQBmQBl__T8AppenderTQBiZQo'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std4conv__T9convErrorTAyaTbZQrFNaNfQnQpmZCQBrQBq13ConvException: error: undefined reference to '_D3std4conv13ConvException7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std4conv__T9convErrorTAyaTbZQrFNaNfQnQpmZCQBrQBq13ConvException: error: undefined reference to '_D3std4conv13ConvException6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std4conv__T9convErrorTAyaTbZQrFNaNfQnQpmZCQBrQBq13ConvException: error: undefined reference to '_D3std4conv13ConvException6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std4conv__T9convErrorTAyaTbZQrFNaNfQnQpmZCQBrQBq13ConvException: error: undefined reference to '_D3std4conv13ConvException8__mixin26__ctorMFNaNbNiNfAyaQdmC6object9ThrowableZCQCyQCxQCv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std4conv__T9convErrorTAyaTaZQrFNaNfQnQpmZCQBrQBq13ConvException: error: undefined reference to '_D3std4conv13ConvException7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std4conv__T9convErrorTAyaTaZQrFNaNfQnQpmZCQBrQBq13ConvException: error: undefined reference to '_D3std4conv13ConvException6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std4conv__T9convErrorTAyaTaZQrFNaNfQnQpmZCQBrQBq13ConvException: error: undefined reference to '_D3std4conv13ConvException6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std4conv__T9convErrorTAyaTaZQrFNaNfQnQpmZCQBrQBq13ConvException: error: undefined reference to '_D3std4conv13ConvException8__mixin26__ctorMFNaNbNiNfAyaQdmC6object9ThrowableZCQCyQCxQCv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std3utf__T10decodeImplVbi1VEQBd8typecons__T4FlagVAyaa19_7573655265706c6163656d656e744463686172ZQCai0TAxaZQDrFNaQkKmZw: error: undefined reference to '_D3std3utf12isValidDcharFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std3utf__T10decodeImplVbi1VEQBd8typecons__T4FlagVAyaa19_7573655265706c6163656d656e744463686172ZQCai0TAxaZQDrFQiKmZ10invalidUTFMFNaNbZCQFfQFe12UTFException: error: undefined reference to '_D3std3utf12UTFException6__ctorMFNaNbNfAyamQemC6object9ThrowableZCQCmQClQCk'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std3utf__T10decodeImplVbi1VEQBd8typecons__T4FlagVAyaa19_7573655265706c6163656d656e744463686172ZQCai0TAxaZQDrFQiKmZ11outOfBoundsMFNaNbZCQFgQFf12UTFException: error: undefined reference to '_D3std3utf12UTFException6__ctorMFNaNbNfAyamQemC6object9ThrowableZCQCmQClQCk'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T10FormatSpecTaZQp__T17writeUpToNextSpecTSQCd5stdio4File17LockingTextWriterZQCdMFNlNfKQBtZb: error: undefined reference to '_D3std9exception__T7enforceHTCQBc6format15FormatExceptionZ__TQBqTbZQBwFNaNfbLAxaAyamZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T10FormatSpecTaZQp__T17writeUpToNextSpecTSQCd5stdio4File17LockingTextWriterZQCdMFNlNfKQBtZb: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp6fillUpMFNaNlNfZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formattedWriteTSQBg5stdio4File17LockingTextWriterTaTAyaTQeZQCjFKQBxMxAaQtQvZ12__dgliteral6MFNaNbNiNfZAxa: error: undefined reference to '_D3std4conv__T4textTAyaTaZQmFNaNbNfQpaZQt'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formattedWriteTSQBg5stdio4File17LockingTextWriterTaTAyaTQeZQCjFKQBxMxAaQtQvZ12__dgliteral7MFNaNbNiNfZAxa: error: undefined reference to '_D3std4conv__T4textTAyaTaZQmFNaNbNfQpaZQt'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std6format__T19needToSwapEndianessTaZQyFNaNbNiNfMKxSQCbQCa__T10FormatSpecTaZQpZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp6__ctorMFNaNbNcNiNfIAaZSQCdQCc__TQByTaZQCe'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp6flDashMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni11isGraphicalFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni11isGraphicalFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp6__ctorMFNaNbNcNiNfIAaZSQCdQCc__TQByTaZQCe'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std4conv__T2toTiZ__TQjTkZQoFNaNfkZi'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp6flDashMFNaNbNdNiNfbZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std4conv__T2toTiZ__TQjTkZQoFNaNfkZi'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std4conv__T2toTiZ__TQjTkZQoFNaNfkZi'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp6flDashMFNaNbNdNiNfbZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std4conv__T2toTiZ__TQjTkZQoFNaNfkZi'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std6format15FormatException7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std6format15FormatException6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std6format15FormatException6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std6format15FormatException7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std6format15FormatException6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std6format15FormatException6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std6format15FormatException7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std6format15FormatException6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std6format15FormatException6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std4conv__T4textTAyaTQeTQhZQqFNaNbNfQtQvQxZQBa'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std4conv__T4textTAyaThTaTaTQkTmZQvFNaNbNfQyhaaQBdmZQBi'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T11formatRangeTSQBd5stdio4File17LockingTextWriterTAyaTaZQCdFNfKQBwKQrMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std6format15FormatException6__ctorMFNaNbNiNfAyaQdmC6object9ThrowableZCQCtQCsQCo'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni19isRegionalIndicatorFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std8internal14unicode_tables7isHangLFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni6hangLVFNaNbNdNiNfZySQBdQBc__T4TrieTSQBtQBs__T9BitPackedTbVmi1ZQrTwVmi1114112TSQDjQDi__T9sliceBitsVmi13Vmi21ZQvTSQErQEq__TQBiVmi8Vmi13ZQBvTSQFsQFr__TQCjVmi0Vmi8ZQCvZQFf'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni__T13PackedPtrImplTSQBcQBb__T9BitPackedTkVmi13ZQsVmi16ZQCa6__ctorMNgFNaNbNcNiNfPNgmZNgSQDrQDq__TQDpTQDdVmi16ZQEc'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni__T13PackedPtrImplTSQBcQBb__T9BitPackedTkVmi13ZQsVmi16ZQCa7opIndexMNgFNaNbNimZQCh'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni__T13PackedPtrImplTSQBcQBb__T9BitPackedTbVmi1ZQrVmi1ZQBy6__ctorMNgFNaNbNcNiNfPNgmZNgSQDpQDo__TQDnTQDbVmi1ZQDz'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni__T13PackedPtrImplTSQBcQBb__T9BitPackedTbVmi1ZQrVmi1ZQBy7opIndexMNgFNaNbNimZQCf'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std8internal14unicode_tables7isHangVFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni7hangLVTFNaNbNdNiNfZySQBeQBd__T4TrieTSQBuQBt__T9BitPackedTbVmi1ZQrTwVmi1114112TSQDkQDj__T9sliceBitsVmi13Vmi21ZQvTSQEsQEr__TQBiVmi8Vmi13ZQBvTSQFtQFs__TQCjVmi0Vmi8ZQCvZQFf'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni__T13PackedPtrImplTSQBcQBb__T9BitPackedTkVmi13ZQsVmi16ZQCa6__ctorMNgFNaNbNcNiNfPNgmZNgSQDrQDq__TQDpTQDdVmi16ZQEc'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni__T13PackedPtrImplTSQBcQBb__T9BitPackedTkVmi13ZQsVmi16ZQCa7opIndexMNgFNaNbNimZQCh'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni__T13PackedPtrImplTSQBcQBb__T9BitPackedTbVmi1ZQrVmi1ZQBy6__ctorMNgFNaNbNcNiNfPNgmZNgSQDpQDo__TQDnTQDbVmi1ZQDz'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni__T13PackedPtrImplTSQBcQBb__T9BitPackedTbVmi1ZQrVmi1ZQBy7opIndexMNgFNaNbNimZQCf'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std8internal14unicode_tables7isHangTFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni19isRegionalIndicatorFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std8internal14unicode_tables7isHangLFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std8internal14unicode_tables7isHangVFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std8internal14unicode_tables7isHangTFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std8internal14unicode_tables7isHangVFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni6hangLVFNaNbNdNiNfZySQBdQBc__T4TrieTSQBtQBs__T9BitPackedTbVmi1ZQrTwVmi1114112TSQDjQDi__T9sliceBitsVmi13Vmi21ZQvTSQErQEq__TQBiVmi8Vmi13ZQBvTSQFsQFr__TQCjVmi0Vmi8ZQCvZQFf'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni__T13PackedPtrImplTSQBcQBb__T9BitPackedTkVmi13ZQsVmi16ZQCa6__ctorMNgFNaNbNcNiNfPNgmZNgSQDrQDq__TQDpTQDdVmi16ZQEc'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni__T13PackedPtrImplTSQBcQBb__T9BitPackedTkVmi13ZQsVmi16ZQCa7opIndexMNgFNaNbNimZQCh'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni__T13PackedPtrImplTSQBcQBb__T9BitPackedTbVmi1ZQrVmi1ZQBy6__ctorMNgFNaNbNcNiNfPNgmZNgSQDpQDo__TQDnTQDbVmi1ZQDz'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni__T13PackedPtrImplTSQBcQBb__T9BitPackedTbVmi1ZQrVmi1ZQBy7opIndexMNgFNaNbNimZQCf'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni7hangLVTFNaNbNdNiNfZySQBeQBd__T4TrieTSQBuQBt__T9BitPackedTbVmi1ZQrTwVmi1114112TSQDkQDj__T9sliceBitsVmi13Vmi21ZQvTSQEsQEr__TQBiVmi8Vmi13ZQBvTSQFtQFs__TQCjVmi0Vmi8ZQCvZQFf'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni__T13PackedPtrImplTSQBcQBb__T9BitPackedTkVmi13ZQsVmi16ZQCa6__ctorMNgFNaNbNcNiNfPNgmZNgSQDrQDq__TQDpTQDdVmi16ZQEc'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni__T13PackedPtrImplTSQBcQBb__T9BitPackedTkVmi13ZQsVmi16ZQCa7opIndexMNgFNaNbNimZQCh'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni__T13PackedPtrImplTSQBcQBb__T9BitPackedTbVmi1ZQrVmi1ZQBy6__ctorMNgFNaNbNcNiNfPNgmZNgSQDpQDo__TQDnTQDbVmi1ZQDz'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni__T13PackedPtrImplTSQBcQBb__T9BitPackedTbVmi1ZQrVmi1ZQBy7opIndexMNgFNaNbNimZQCf'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni18graphemeExtendTrieFNaNbNdNiNfZySQBqQBp__T4TrieTSQCgQCf__T9BitPackedTbVmi1ZQrTwVmi1114112TSQDwQDv__T9sliceBitsVmi13Vmi21ZQvTSQFeQFd__TQBiVmi8Vmi13ZQBvTSQGfQGe__TQCjVmi0Vmi8ZQCvZQFf'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni6mcTrieFNaNbNdNiNfZySQBdQBc__T4TrieTSQBtQBs__T9BitPackedTbVmi1ZQrTwVmi1114112TSQDjQDi__T9sliceBitsVmi13Vmi21ZQvTSQErQEq__TQBiVmi8Vmi13ZQBvTSQFsQFr__TQCjVmi0Vmi8ZQCvZQFf'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAyaTaZQCeFNfKQBwQqMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp6flDashMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formatUnsignedTSQBg5stdio4File17LockingTextWriterTmTaZQCeFNfKQBumMKxSQDhQDg__T10FormatSpecTaZQpkbZv: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp6flDashMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formatUnsignedTSQBg5stdio4File17LockingTextWriterTmTaZQCeFNfKQBumMKxSQDhQDg__T10FormatSpecTaZQpkbZv: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp6flZeroMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formatUnsignedTSQBg5stdio4File17LockingTextWriterTmTaZQCeFNfKQBumMKxSQDhQDg__T10FormatSpecTaZQpkbZv: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp6flPlusMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formatUnsignedTSQBg5stdio4File17LockingTextWriterTmTaZQCeFNfKQBumMKxSQDhQDg__T10FormatSpecTaZQpkbZv: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp6flHashMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formatUnsignedTSQBg5stdio4File17LockingTextWriterTmTaZQCeFNfKQBumMKxSQDhQDg__T10FormatSpecTaZQpkbZv: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp6flHashMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formatUnsignedTSQBg5stdio4File17LockingTextWriterTmTaZQCeFNfKQBumMKxSQDhQDg__T10FormatSpecTaZQpkbZv: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp7flSpaceMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formatUnsignedTSQBg5stdio4File17LockingTextWriterTmTaZQCeFNfKQBumMKxSQDhQDg__T10FormatSpecTaZQpkbZv: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp11flSeparatorMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formatUnsignedTSQBg5stdio4File17LockingTextWriterTmTaZQCeFNfKQBumMKxSQDhQDg__T10FormatSpecTaZQpkbZv: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp11flSeparatorMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formatUnsignedTSQBg5stdio4File17LockingTextWriterTmTaZQCeFNfKQBumMKxSQDhQDg__T10FormatSpecTaZQpkbZv: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp11flSeparatorMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formatUnsignedTSQBg5stdio4File17LockingTextWriterTmTaZQCeFNfKQBumMKxSQDhQDg__T10FormatSpecTaZQpkbZv: error: undefined reference to '_D3std9exception14ErrnoException7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formatUnsignedTSQBg5stdio4File17LockingTextWriterTmTaZQCeFNfKQBumMKxSQDhQDg__T10FormatSpecTaZQpkbZv: error: undefined reference to '_D3std9exception14ErrnoException6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formatUnsignedTSQBg5stdio4File17LockingTextWriterTmTaZQCeFNfKQBumMKxSQDhQDg__T10FormatSpecTaZQpkbZv: error: undefined reference to '_D3std9exception14ErrnoException6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formatUnsignedTSQBg5stdio4File17LockingTextWriterTmTaZQCeFNfKQBumMKxSQDhQDg__T10FormatSpecTaZQpkbZv: error: undefined reference to '_D3std9exception14ErrnoException6__ctorMFNfAyaQdmZCQBxQBwQBp'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAwTaZQCdFNfKQBvQpMKxSQDhQDg__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni19isRegionalIndicatorFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAwTaZQCdFNfKQBvQpMKxSQDhQDg__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std8internal14unicode_tables7isHangLFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAwTaZQCdFNfKQBvQpMKxSQDhQDg__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni6hangLVFNaNbNdNiNfZySQBdQBc__T4TrieTSQBtQBs__T9BitPackedTbVmi1ZQrTwVmi1114112TSQDjQDi__T9sliceBitsVmi13Vmi21ZQvTSQErQEq__TQBiVmi8Vmi13ZQBvTSQFsQFr__TQCjVmi0Vmi8ZQCvZQFf'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAwTaZQCdFNfKQBvQpMKxSQDhQDg__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std8internal14unicode_tables7isHangVFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAwTaZQCdFNfKQBvQpMKxSQDhQDg__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std3uni7hangLVTFNaNbNdNiNfZySQBeQBd__T4TrieTSQBuQBt__T9BitPackedTbVmi1ZQrTwVmi1114112TSQDkQDj__T9sliceBitsVmi13Vmi21ZQvTSQEsQEr__TQBiVmi8Vmi13ZQBvTSQFtQFs__TQCjVmi0Vmi8ZQCvZQFf'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAwTaZQCdFNfKQBvQpMKxSQDhQDg__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std8internal14unicode_tables7isHangTFNaNbNiNfwZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T12writeAlignedTSQBe5stdio4File17LockingTextWriterTAwTaZQCdFNfKQBvQpMKxSQDhQDg__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp6flDashMxFNaNbNdNiNfZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T15formatValueImplTSQBh5stdio4File17LockingTextWriterTkTaZQCfFNfKQBukMKxSQDiQDh__T10FormatSpecTaZQpZv: error: undefined reference to '_D3std6format__T19needToSwapEndianessTaZQyFNaNbNiNfMKxSQCbQCa__T10FormatSpecTaZQpZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formattedWriteTSQBg5stdio4File17LockingTextWriterTaTkZQCeFKQBsMxAakZ12__dgliteral5MFNaNbNiNfZAxa: error: undefined reference to '_D3std4conv__T4textTAyaTaZQmFNaNbNfQpaZQt'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T6getNthVAyaa19_736570617261746f7220636861726163746572SQCq6traits10isSomeCharTwTkZQDdFNaNfkkZw: error: undefined reference to '_D3std4conv__T4textTAyaTQeTQhTQkTkZQvFNaNbNfQyQBaQBdQBgkZQBl'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T6getNthVAyaa19_736570617261746f7220636861726163746572SQCq6traits10isSomeCharTwTkZQDdFNaNfkkZw: error: undefined reference to '_D3std4conv__T4textTAyaTQeTQhZQqFNaNbNfQtQvQxZQBa'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T6getNthVAyaa19_736570617261746f7220636861726163746572SQCq6traits10isSomeCharTwTkZQDdFNaNfkkZw: error: undefined reference to '_D3std6format15FormatException6__ctorMFNaNbNiNfAyaQdmC6object9ThrowableZCQCtQCsQCo'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formattedWriteTSQBg5stdio4File17LockingTextWriterTaTkZQCeFKQBsMxAakZ12__dgliteral6MFNaNbNiNfZAxa: error: undefined reference to '_D3std4conv__T4textTAyaTaZQmFNaNbNfQpaZQt'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formattedWriteTSQBg5array__T8AppenderTAyaZQoTaTQjTmZQCcFNaNfKQBuMxAaQBemZk: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formattedWriteTSQBg5array__T8AppenderTAyaZQoTaTQjTmZQCcFNaNfKQBuMxAaQBemZk: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp6__ctorMFNaNbNcNiNfIAaZSQCdQCc__TQByTaZQCe'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formattedWriteTSQBg5array__T8AppenderTAyaZQoTaTQjTmZQCcFNaNfKQBuMxAaQBemZk: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp__T17writeUpToNextSpecTSQCd5array__T8AppenderTAyaZQoZQByMFNaNlNfKQBqZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formattedWriteTSQBg5array__T8AppenderTAyaZQoTaTQjTmZQCcFNaNfKQBuMxAaQBemZk: error: undefined reference to '_D3std6format__T14formatIntegralTSQBg5array__T8AppenderTAyaZQoTmTaZQBzFNaNfKQBrxmMKxSQDfQDe__T10FormatSpecTaZQpkmZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formattedWriteTSQBg5array__T8AppenderTAyaZQoTaTQjTmZQCcFNaNfKQBuMxAaQBemZk: error: undefined reference to '_D3std6format__T10FormatSpecTaZQp__T17writeUpToNextSpecTSQCd5array__T8AppenderTAyaZQoZQByMFNaNlNfKQBqZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formattedWriteTSQBg5array__T8AppenderTAyaZQoTaTQjTmZQCcFNaNfKQBuMxAaQBemZk: error: undefined reference to '_D3std6format__T11formatValueTSQBd5array__T8AppenderTAyaZQoTQhTaZQBxFNaNfKQBsKQzMKxSQDeQDd__T10FormatSpecTaZQpZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formattedWriteTSQBg5array__T8AppenderTAyaZQoTaTQjTmZQCcFNaNfKQBuMxAaQBemZk: error: undefined reference to '_D3std6format__T19needToSwapEndianessTaZQyFNaNbNiNfMKxSQCbQCa__T10FormatSpecTaZQpZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formattedWriteTSQBg5array__T8AppenderTAyaZQoTaTQjTmZQCcFNaNfKQBuMxAaQBemZk: error: undefined reference to '_D3std5range10primitives__T3putTSQBf5array__T8AppenderTAyaZQoTxaZQBmFNaNbNfKQBsxaZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formattedWriteTSQBg5array__T8AppenderTAyaZQoTaTQjTmZQCcFNaNfKQBuMxAaQBemZk: error: undefined reference to '_D3std5range10primitives__T3putTSQBf5array__T8AppenderTAyaZQoTxaZQBmFNaNbNfKQBsxaZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formattedWriteTSQBg5array__T8AppenderTAyaZQoTaTQjTmZQCcFNaNfKQBuMxAaQBemZk: error: undefined reference to '_D3std5range10primitives__T3putTSQBf5array__T8AppenderTAyaZQoTxaZQBmFNaNbNfKQBsxaZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formattedWriteTSQBg5array__T8AppenderTAyaZQoTaTQjTmZQCcFNaNfKQBuMxAaQBemZk: error: undefined reference to '_D3std5range10primitives__T3putTSQBf5array__T8AppenderTAyaZQoTxaZQBmFNaNbNfKQBsxaZv'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formattedWriteTSQBg5array__T8AppenderTAyaZQoTaTQjTmZQCcFNaNfKQBuMxAaQBemZk: error: undefined reference to '_D3std4conv__T4textTAyaThTaTaTQkTmZQvFNaNbNfQyhaaQBdmZQBi'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formattedWriteTSQBg5array__T8AppenderTAyaZQoTaTQjTmZQCcFNaNfKQBuMxAaQBemZk: error: undefined reference to '_D3std4conv__T4textTAyaTQeTQhTQkTkZQvFNaNbNfQyQBaQBdQBgkZQBl'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formattedWriteTSQBg5array__T8AppenderTAyaZQoTaTQjTmZQCcFNaNfKQBuMxAaQBemZk: error: undefined reference to '_D3std4conv__T4textTAyaTQeTQhZQqFNaNbNfQtQvQxZQBa'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formattedWriteTSQBg5array__T8AppenderTAyaZQoTaTQjTmZQCcFNaNfKQBuMxAaQBemZk: error: undefined reference to '_D3std6format15FormatException6__ctorMFNaNbNiNfAyaQdmC6object9ThrowableZCQCtQCsQCo'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formattedWriteTSQBg5array__T8AppenderTAyaZQoTaTQjTmZQCcFNaNfKQBuMxAaQBemZk: error: undefined reference to '_D3std4conv21ConvOverflowException7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formattedWriteTSQBg5array__T8AppenderTAyaZQoTaTQjTmZQCcFNaNfKQBuMxAaQBemZk: error: undefined reference to '_D3std4conv21ConvOverflowException6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formattedWriteTSQBg5array__T8AppenderTAyaZQoTaTQjTmZQCcFNaNfKQBuMxAaQBemZk: error: undefined reference to '_D3std4conv21ConvOverflowException6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T14formattedWriteTSQBg5array__T8AppenderTAyaZQoTaTQjTmZQCcFNaNfKQBuMxAaQBemZk: error: undefined reference to '_D3std4conv21ConvOverflowException6__ctorMFNaNbNfAyaQdmZCQCdQCcQCa'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__TQkTaTAyaTmZQvFIAaQmmZ12__dgliteral5MFNaNbNiNfZAxa: error: undefined reference to '_D3std4conv__T4textTAyaTkTQgTmTQlZQuFNaNbNfQxkQBamQBeZQBi'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T6getNthVAyaa19_736570617261746f7220636861726163746572SQCq6traits10isSomeCharTwTQCtTmZQDhFNaNfkQDimZw: error: undefined reference to '_D3std4conv__T4textTAyaTQeTQhTQkTkZQvFNaNbNfQyQBaQBdQBgkZQBl'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T6getNthVAyaa19_736570617261746f7220636861726163746572SQCq6traits10isSomeCharTwTQCtTmZQDhFNaNfkQDimZw: error: undefined reference to '_D3std4conv__T4textTAyaTQeTQhTQkTkZQvFNaNbNfQyQBaQBdQBgkZQBl'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T6getNthVAyaa19_736570617261746f7220636861726163746572SQCq6traits10isSomeCharTwTQCtTmZQDhFNaNfkQDimZw: error: undefined reference to '_D3std4conv__T4textTAyaTQeTQhZQqFNaNbNfQtQvQxZQBa'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T6getNthVAyaa13_696e7465676572207769647468SQCe6traits10isIntegralTiTQChTmZQCvFNaNfkQCwmZi: error: undefined reference to '_D3std4conv21ConvOverflowException7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T6getNthVAyaa13_696e7465676572207769647468SQCe6traits10isIntegralTiTQChTmZQCvFNaNfkQCwmZi: error: undefined reference to '_D3std4conv21ConvOverflowException6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T6getNthVAyaa13_696e7465676572207769647468SQCe6traits10isIntegralTiTQChTmZQCvFNaNfkQCwmZi: error: undefined reference to '_D3std4conv21ConvOverflowException6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T6getNthVAyaa13_696e7465676572207769647468SQCe6traits10isIntegralTiTQChTmZQCvFNaNfkQCwmZi: error: undefined reference to '_D3std4conv21ConvOverflowException6__ctorMFNaNbNfAyaQdmZCQCdQCcQCa'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T6getNthVAyaa17_696e746567657220707265636973696f6eSQCm6traits10isIntegralTiTQCpTmZQDdFNaNfkQDemZi: error: undefined reference to '_D3std4conv21ConvOverflowException7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T6getNthVAyaa17_696e746567657220707265636973696f6eSQCm6traits10isIntegralTiTQCpTmZQDdFNaNfkQDemZi: error: undefined reference to '_D3std4conv21ConvOverflowException6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T6getNthVAyaa17_696e746567657220707265636973696f6eSQCm6traits10isIntegralTiTQCpTmZQDdFNaNfkQDemZi: error: undefined reference to '_D3std4conv21ConvOverflowException6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:function _D3std6format__T6getNthVAyaa17_696e746567657220707265636973696f6eSQCm6traits10isIntegralTiTQCpTmZQDdFNaNfkQDemZi: error: undefined reference to '_D3std4conv21ConvOverflowException6__ctorMFNaNbNfAyaQdmZCQCdQCcQCa'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D15TypeInfo_HAyaAv6__initZ: error: undefined reference to '_D25TypeInfo_AssociativeArray6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D15TypeInfo_HAyaAv6__initZ: error: undefined reference to '_D11TypeInfo_Av6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D29TypeInfo_AS3std6getopt6Option6__initZ: error: undefined reference to '_D14TypeInfo_Array6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D28TypeInfo_S3std6getopt6Option6__initZ: error: undefined reference to '_D15TypeInfo_Struct6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D28TypeInfo_S3std6getopt6Option6__initZ: error: undefined reference to '_D3std6getopt6Option9__xtoHashFNbNeKxSQBkQBjQBfZm'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D28TypeInfo_S3std6getopt6Option6__initZ: error: undefined reference to '_D3std6getopt6Option11__xopEqualsFKxSQBjQBiQBeKxQmZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D13TypeInfo_AAya6__initZ: error: undefined reference to '_D14TypeInfo_Array6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D11TypeInfo_xm6__initZ: error: undefined reference to '_D14TypeInfo_Const6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D11TypeInfo_xm6__initZ: error: undefined reference to '_D10TypeInfo_m6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D11TypeInfo_xb6__initZ: error: undefined reference to '_D14TypeInfo_Const6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D11TypeInfo_xb6__initZ: error: undefined reference to '_D10TypeInfo_b6__initZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D12TypeInfo_xAa6__initZ: error: undefined reference to '_D14TypeInfo_Const6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common9fieldlist12__ModuleInfoZ: error: undefined reference to '_D3std9exception12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common9fieldlist12__ModuleInfoZ: error: undefined reference to '_D3std6format12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common9fieldlist12__ModuleInfoZ: error: undefined reference to '_D3std5range12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common9fieldlist12__ModuleInfoZ: error: undefined reference to '_D3std5regex12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common9fieldlist12__ModuleInfoZ: error: undefined reference to '_D3std5stdio12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common9fieldlist12__ModuleInfoZ: error: undefined reference to '_D3std6traits12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common9fieldlist12__ModuleInfoZ: error: undefined reference to '_D3std8typecons12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common9fieldlist12__ModuleInfoZ: error: undefined reference to '_D3std5regex8internal12backtracking12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common9fieldlist12__ModuleInfoZ: error: undefined reference to '_D3std5regex8internal6parser12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common9fieldlist12__ModuleInfoZ: error: undefined reference to '_D3std5array12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common9fieldlist12__ModuleInfoZ: error: undefined reference to '_D3std10functional12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common9fieldlist12__ModuleInfoZ: error: undefined reference to '_D3std4conv12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common9fieldlist12__ModuleInfoZ: error: undefined reference to '_D3std9algorithm8mutation12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common9fieldlist12__ModuleInfoZ: error: undefined reference to '_D3std9algorithm10comparison12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common9fieldlist12__ModuleInfoZ: error: undefined reference to '_D3std6string12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common9fieldlist12__ModuleInfoZ: error: undefined reference to '_D3std5regex8internal8thompson12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common9fieldlist12__ModuleInfoZ: error: undefined reference to '_D4core8internal5array5utils12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common9fieldlist12__ModuleInfoZ: error: undefined reference to '_D4core6memory12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common9fieldlist12__ModuleInfoZ: error: undefined reference to '_D3std3uni12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common8numerics12__ModuleInfoZ: error: undefined reference to '_D3std6traits12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common8numerics12__ModuleInfoZ: error: undefined reference to '_D3std5range12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common5utils16InputSourceRange7__ClassZ: error: undefined reference to '_D14TypeInfo_Class6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common5utils16InputSourceRange7__ClassZ: error: undefined reference to '_D6Object7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common5utils16InputSourceRange6__vtblZ: error: undefined reference to '_D6object6Object8toStringMFZAya'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common5utils16InputSourceRange6__vtblZ: error: undefined reference to '_D6object6Object6toHashMFNbNeZm'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common5utils16InputSourceRange6__vtblZ: error: undefined reference to '_D6object6Object5opCmpMFCQqZi'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common5utils16InputSourceRange6__vtblZ: error: undefined reference to '_D6object6Object8opEqualsMFCQtZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common5utils11InputSource7__ClassZ: error: undefined reference to '_D14TypeInfo_Class6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common5utils11InputSource7__ClassZ: error: undefined reference to '_D6Object7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common5utils11InputSource6__vtblZ: error: undefined reference to '_D6object6Object8toStringMFZAya'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common5utils11InputSource6__vtblZ: error: undefined reference to '_D6object6Object6toHashMFNbNeZm'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common5utils11InputSource6__vtblZ: error: undefined reference to '_D6object6Object5opCmpMFCQqZi'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common5utils11InputSource6__vtblZ: error: undefined reference to '_D6object6Object8opEqualsMFCQtZb'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D44TypeInfo_S3std5array__T8AppenderTAyaZQo4Data6__initZ: error: undefined reference to '_D15TypeInfo_Struct6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D43TypeInfo_S3std5array__T8AppenderTAaZQn4Data6__initZ: error: undefined reference to '_D15TypeInfo_Struct6__vtblZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common5utils12__ModuleInfoZ: error: undefined reference to '_D3std5range12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common5utils12__ModuleInfoZ: error: undefined reference to '_D3std5stdio12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common5utils12__ModuleInfoZ: error: undefined reference to '_D3std6traits12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common5utils12__ModuleInfoZ: error: undefined reference to '_D3std8typecons12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils6common5utils12__ModuleInfoZ: error: undefined reference to '_D3std9exception12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils7csv2tsv12__ModuleInfoZ: error: undefined reference to '_D3std5stdio12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils7csv2tsv12__ModuleInfoZ: error: undefined reference to '_D3std9exception12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils7csv2tsv12__ModuleInfoZ: error: undefined reference to '_D3std6format12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils7csv2tsv12__ModuleInfoZ: error: undefined reference to '_D3std5range12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils7csv2tsv12__ModuleInfoZ: error: undefined reference to '_D3std6traits12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils7csv2tsv12__ModuleInfoZ: error: undefined reference to '_D3std8typecons12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils7csv2tsv12__ModuleInfoZ: error: undefined reference to '_D3std4path12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils7csv2tsv12__ModuleInfoZ: error: undefined reference to '_D3std9algorithm8mutation12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils7csv2tsv12__ModuleInfoZ: error: undefined reference to '_D3std4conv12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils7csv2tsv12__ModuleInfoZ: error: undefined reference to '_D3std5array12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils7csv2tsv12__ModuleInfoZ: error: undefined reference to '_D4core6memory12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils7csv2tsv12__ModuleInfoZ: error: undefined reference to '_D4core8internal5array5utils12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils7csv2tsv12__ModuleInfoZ: error: undefined reference to '_D3std9algorithm10comparison12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils7csv2tsv12__ModuleInfoZ: error: undefined reference to '_D3std10functional12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils7csv2tsv12__ModuleInfoZ: error: undefined reference to '_D3std6string12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:_D9tsv_utils7csv2tsv12__ModuleInfoZ: error: undefined reference to '_D3std3uni12__ModuleInfoZ'
    /tmp/lto-llvm-8b1aea.o(.data+0x0): error: undefined reference to '_D6object9Throwable7__ClassZ'
    /tmp/lto-llvm-8b1aea.o(.data+0x8): error: undefined reference to '_D9Exception7__ClassZ'
    /tmp/lto-llvm-8b1aea.o:tsvutils_version.d:DW.ref._d_eh_personality: error: undefined reference to '_d_eh_personality'
    collect2: error: ld returned 1 exit status
    Error: /usr/bin/cc failed with status: 1
    make[1]: *** [../makeapp.mk:18: /tmp/tsv-utils/bin/csv2tsv] Error 1
    make[1]: Leaving directory '/tmp/tsv-utils/csv2tsv'
    make: *** [makefile:96: csv2tsv] Error 2
    

    ldc2.conf contains the following on Archlinux:

    default:
    {
        // default switches injected before all explicit command-line switches
        switches = [
            "-defaultlib=phobos2-ldc,druntime-ldc","-link-defaultlib-shared"
        ];
        // default switches appended after all explicit command-line switches
        post-switches = [
            "-I/usr/include/dlang/ldc",
        ];
        // default directories to be searched for libraries when linking
        lib-dirs = [
            "/usr/lib",
        ];
        // default rpath when linking against the shared default libs
        rpath = "/usr/lib";
    };
    
    bug fixed/done 
    opened by rymrg 14
  • Significant digits/rounding

    Significant digits/rounding

    Numbers like 9830.76111111 and 18421.40625 are rather unfriendly for humans. It'd be nice to be able to specify significant digits for mean/median/mad/et al.

    enhancement fixed/done 
    opened by Wyatts 12
  • Compilation error, tsv-filter: undefined reference

    Compilation error, tsv-filter: undefined reference

    My system install of dmd is v2.068.1. Also tried it with the latest version of dmd (v.2.071.0). I cloned the repository and in the repo root issued make:

    [code]$ git clone https://github.com/eBay/tsv-utils-dlang
    Cloning into 'tsv-utils-dlang'...                                      
    remote: Counting objects: 89, done.                                    
    remote: Compressing objects: 100% (60/60), done.                       
    remote: Total 89 (delta 11), reused 89 (delta 11), pack-reused 0       
    Unpacking objects: 100% (89/89), done.                                 
    Checking connectivity... done.                            
    
    [code]$ cd tsv-utils-dlang/                              
    [tsv-utils-dlang]$ make                                                             
    
    make -C common                                                                                    
    make[1]: Entering directory `/home/boulund/code/tsv-utils-dlang/common'                           
    make[1]: `release' is up to date.                                                                 
    make[1]: Leaving directory `/home/boulund/code/tsv-utils-dlang/common'                            
    
    make -C number-lines                                                                              
    make[1]: Entering directory `/home/boulund/code/tsv-utils-dlang/number-lines'                     
    dmd -release -O -inline -boundscheck=off -odobj  -of/home/boulund/code/tsv-utils-dlang/bin/number-lines -I/home/boulund/code/tsv-utils-dlang/common/src src/number-lines.d                          
    make[1]: Leaving directory `/home/boulund/code/tsv-utils-dlang/number-lines'                      
    
    make -C tsv-select                                                                                
    make[1]: Entering directory `/home/boulund/code/tsv-utils-dlang/tsv-select'                       
    dmd -release -O -inline -boundscheck=off -odobj  -of/home/boulund/code/tsv-utils-dlang/bin/tsv-select -I/home/boulund/code/tsv-utils-dlang/common/src src/tsv-select.d /home/boulund/code/tsv-utils-dlang/common/src/tsvutil.d                                                                        
    make[1]: Leaving directory `/home/boulund/code/tsv-utils-dlang/tsv-select'                        
    
    make -C tsv-filter                                                                                
    make[1]: Entering directory `/home/boulund/code/tsv-utils-dlang/tsv-filter'                       
    dmd -release -O -inline -boundscheck=off -odobj  -of/home/boulund/code/tsv-utils-dlang/bin/tsv-filter -I/home/boulund/code/tsv-utils-dlang/common/src src/tsv-filter.d                              
    obj/tsv-filter.o: In function `_D10tsv_filter9istrInFldFxAAamAywZb':                              
    src/tsv-filter.d:(.text._D10tsv_filter9istrInFldFxAAamAywZb+0x42): undefined reference to `_D3std9algorithm9searching49__T16simpleMindedFindVAyaa6_61203d3d2062TAxaTAywZ16simpleMindedFindFNaNfAxaAywZAxa'                                                                                            
    obj/tsv-filter.o: In function `_D10tsv_filter12istrNotInFldFxAAamAywZb':                          
    src/tsv-filter.d:(.text._D10tsv_filter12istrNotInFldFxAAamAywZb+0x42): undefined reference to `_D3std9algorithm9searching49__T16simpleMindedFindVAyaa6_61203d3d2062TAxaTAywZ16simpleMindedFindFNaNfAxaAywZAxa'                                                                                        
    obj/tsv-filter.o: In function `_D3std9algorithm9searching36__T4findVAyaa6_61203d3d2062TAxaTAywZ4findFNaNfAxaAywZAxa':                                                                               
    src/tsv-filter.d:(.text._D3std9algorithm9searching36__T4findVAyaa6_61203d3d2062TAxaTAywZ4findFNaNfAxaAywZAxa+0x37): undefined reference to `_D3std9algorithm9searching49__T16simpleMindedFindVAyaa6_61203d3d2062TAxaTAywZ16simpleMindedFindFNaNfAxaAywZAxa'                                           
    obj/tsv-filter.o: In function `_D3std9algorithm9searching12__T7canFindZ20__T7canFindTAxaTAywZ7canFindFNaNfAxaAywZb':
    src/tsv-filter.d:(.text._D3std9algorithm9searching12__T7canFindZ20__T7canFindTAxaTAywZ7canFindFNaNfAxaAywZb+0x37): undefined reference to `_D3std9algorithm9searching49__T16simpleMindedFindVAyaa6_61203d3d2062TAxaTAywZ16simpleMindedFindFNaNfAxaAywZAxa'                                            
    collect2: error: ld returned 1 exit status                                                        
    --- errorlevel 1                                                                                  
    make[1]: *** [/home/boulund/code/tsv-utils-dlang/bin/tsv-filter] Error 1                          
    make[1]: Leaving directory `/home/boulund/code/tsv-utils-dlang/tsv-filter'                        
    make: *** [tsv-filter] Error 2                                                                    
    
    fixed/done 
    opened by boulund 9
  • Statically linked binaries for Linux

    Statically linked binaries for Linux

    It would be nice if the pre-compiled binaries for Linux were statically linked. This would allow them to work on a more variety of Linux distributions and versions. Since it looks like there are no external dependencies it should be pretty simple when compiling with LDC to just add the -static flag.

    enhancement fixed/done 
    opened by jacob-carlborg 9
  • Compute quantiles of columns

    Compute quantiles of columns

    Hi,

    Just wondering if it's possible to implement a function for computing any given quantile of a column with tsv-summarize. I use datamash a lot and computing any given quantile is feature I'm missing there as well (it can compute the standard quartiles, however). If the functionality is already in tsv-summarize, sorry for not finding out about it in my cursory glance through the documentation.

    enhancement fixed/done 
    opened by boulund 9
  • reproducible benchmarks?

    reproducible benchmarks?

    I'd like to try and reproduce some of your benchmarks. Is possible to acquire the data used in each of the benchmarks? Thanks.

    question 
    opened by BurntSushi 8
  • Select columns by name

    Select columns by name

    Another day, another feature request. ;)

    I was doing some ad hoc data mangling late yesterday and kept thinking it would be very useful to be able to refer to columns by name. Part of it was the constant checking of which data had which column number. Especially once I started using multiple tools in pipelines, it would have saved time to be able to just call things by name. A simple example: tsv-join -k 1,2 -f transaction-rate.tsv -a 3 average-crossover-times.tsv | tsv-select -f 1,2,7 --rest last I'd find it more readable (and thus better for use in larger scripts) to be able to do something like this: tsv-join -k cores,threads -f transaction-rate.tsv -a 't/m' average-crossover-times.tsv | tsv-select -f cores,threads,'t/m' --rest last

    enhancement fixed/done 
    opened by Wyatts 7
  • Add a simple travis setup

    Add a simple travis setup

    This adds a simple .travis.yml that should help you to get started.

    More documentation can be found at:

    https://docs.travis-ci.com/user/languages/d/

    (the other Travis commands are not D-specific)

    opened by wilzbach 6
  • tsv-summarize: doesn't support windows line-ending

    tsv-summarize: doesn't support windows line-ending

    When aggregating the last column, the prebuilt binary for linux (v1.1.15) returns the following error:

    ' when converting from type const(char)[] to type doubleUnexpected ' File: dummy.tsv Line: 2

    I've used tsv-append, tsv-uniq and tsv-select, and each works just fine. After updating line-endings to unix, tsv-summarize works.

    bug fixed/done 
    opened by Halmaethor 6
  • Package tsv-utils for conda(-forge)?

    Package tsv-utils for conda(-forge)?

    I love tsv-utils, it's so good. I'm using it extensively to analyze SARS-CoV-2 metadata (5.5m line TSVs with around 40 columns giving 5GB files).

    I'm telling everyone about it and people love it when they try it.

    One thing that's in the way of wider adoption is the lack of packaging. In the bioinformatics community, conda is the de facto standard. It'd be amazing if tsv-utils was available through conda-forge or bioconda. I'm happy to help maintain, but I've never packaged something for bioconda myself.

    opened by corneliusroemer 0
  • Homebrew install

    Homebrew install

    Is there interest in an official homebrew formula for these tools?

    I created one for myself at https://github.com/rothgar/homebrew-tap/blob/master/Formula/tsv-utils.rb and I could PR it to a repo if eBay has a public homebrew repo.

    You can install my formula with homebrew install rothgar/tap/tsv-utils

    It works on macOS and Linux.

    opened by rothgar 2
  • Status of Windows build

    Status of Windows build

    This issues tracks the status of native Windows builds for the toolkit.

    Windows is not currently a supported platform. Windows users are encouraged to run Linux builds of the tools using either Windows Subsystem for Linux (WSL) or Docker for Windows.

    Acknowledging the above caveat, it is useful to track known issues on Windows and resolve them over time. At present, the toolkit is built on Windows as part of CI tests, and large parts of the test suite run successfully. Cases where the test suite does not run successfully are primarily due to limitations in the test suite, not the tools. At this time there are no known bugs in the tools, but there are gaps in the runnable test suite and limited real-world testing.

    The two main issues for having Windows support are having a complete CI test suite that runs on Windows, and resolving inconsistencies in Windows newline handling. Most other known issues are minor, though a couple complicate having a test suite shared across Windows and Unix platforms. With PRs #314 and #320 newline consistency issues are largely addressed.

    Windows CI Test suite status

    A Windows CI test suite was setup using GitHub Actions. See PRs #313 and #315. Current status:

    • [x] Build (compile/link) w/ dub, DMD 64-bit - Done (passses)
    • [x] Build (compile/link) w/ dub, LDC 64-bit - Done (passses)
    • [x] Build (compile/link) w/ make, DMD 64-bit - Done (passses)
    • [x] Build (compile/link) w/ make, LDC 64-bit - Done (passses)
    • [x] Built-in unit tests w/ make unittest, DMD 64-bit - Passes, with minor caveats. See "Disabled unit tests" below.
    • [ ] Built-in unit tests w/ make unittest, LDC 64-bit - Fails in tsv-sample due to differences in floating point format output. As an example, a floating point value formatted as 0.75346697377181959 on Linux/MacOs is formatted as 0.75346697377181970 on Windows. This looks like a round-off difference in a mathematical calculation, nothing more.
    • [ ] Command line unit tests w/ make test, both DMD and LDC. These fail from the beginning because of newline differences between the golden set files from the repo and the results produced in the tests. In particular, the "error" and "help" tests that generate messages to end users are getting written using Windows newlines, but the "gold" files with expected results were generated on Unix. The main complication is that many expected results should be newline equivalent, so different strategies are needed for each.
    • [ ] Input files with Windows newlines - The test suite needs to include files with Windows newlines, for every tool.

    Notes:

    • Disabled unit tests - A pair of rounding tests for common.tsv-utils.numerics.formatNumber function fail on Windows and were disabled. The cases are formatNumber(0.6, 0) and formatNumber(-0.6, 0). These should return "1" and "-1" respectively, but on Windows return "0" and "-0". This is due to incorrect results from the calls being made to std.format.format. std.format.format is likely calling snprintf from platform's C library. The disabled unit tests are in common.tsv-utils.numerics.d starting at lines 220 and 334.
      Update (03/14/21): This has been addressed in DMD 2.096, PR #7757 by moving the work into Phobos. Unit tests have been conditioned on version.

    Windows Newline handling

    On Unix and MacOs tsv-utils requires and generates Unix newlines. However, a newline handling policy has never been identified for running on a Windows platform. As a result, tools are inconsistent in the manner they handled Windows newlines when running on Windows. Some possible newline handling policies:

    1. Read and write Unix newlines only, on all platforms.
    2. Read and write using platform preferred linefeeds.
    3. Read either Windows or Unix linefeeds; Write Unix linefeeds
    4. Full customization via command line arguments.

    Option 1 is simplest policy to support and what is being done initially. It is the easiest to enforce in the current code, and easiest to support in the current test suite. And, it is a reasonable choice in many environments, especially in circumstances where a mix of Unix and Windows platforms are in use. If data files are being shared, Unix newlines will normally be preferred. Option 1 is also consistent with other choices made in the toolkit. In particular, supporting only one file format (UTF-8 TSV), and delegating conversion to that format to other tools (e.g. dos2unix, csv2tsv).

    Option 1 is largely in place with PRs #314 and #320, but the test suite still needs work to test it fully. Tasks:

    • [x] Detection of Windows newlines when on a Window platform, same as it is being done on Unix. (PR #320)
    • [ ] Have files with Windows newlines (or platform newlines) in the test suite so these cases are tested.

    Option 2 might be the preferred option in many traditional applications, but it is not clear if this is a good choice for data mining tools. In particular, it is very common to share data files between people, platforms, and tools. In such environments Unix newlines will be preferred. Switching to Windows newlines on Windows machines may be more an annoyance than a benefit.

    Option 3, reading both newline forms, but writing Unix newlines, has some nice properties. And, it might be easier done than expected, as most tools use bufferedByLine. In particular, bufferedByLine.front handles newlines. However, a number of tools have their own reader functionality, so it would still be necessary to have a test suite for each tool. And, it is not really necessary given the availability of tools like dos2unix. Still, this option may be worth consideration.

    Option 4, full customization of newline handling, would provide the most complete solution. However, it has a material downsides. It creates additional user complexity in the form of additional command line arguments. It also creates complexity in the tools and test suite. At present these downsides seem to outweigh the benefits.

    Other issues

    • Floating point number formatting - This is described under "Disabled unit tests" above. This affects primarily tsv-pretty when printing floats in formatted forms. Appears to affect a relatively small number of forms, though it is undesirable when it occurs.
      Update (03/14/21): This has been addressed in DMD 2.096, PR #7757 by moving the work into Phobos. This should eliminate this problem, especially when the LDC release with this version is available.
    Windows 
    opened by jondegenhardt 6
  • tsv-summarize: Slice SummarizerBase._operators when invoking std.algorithm.each

    tsv-summarize: Slice SummarizerBase._operators when invoking std.algorithm.each

    Code improvement. SummarizerBase._operators is a doubly linked list (std.container.dlist). It's not an input range, but can converted to one by slicing. This is done in most of the tsv-summarize code, but not in SummarizerBase.processHeaderLine, which directly invokes std.algorithm.each (line 865):

       _operators.each!(x => x.processHeaderLine(lineFields));
    

    This works for std.algorithm.each, but better code would be to slice it (_operators[].each!) to turn it into a proper input range. Identified by Phobos PR #7638. During an intermediate point in the PR buildkite produced the error:

    Error: template `std.algorithm.iteration.each` cannot deduce function from argument types
    `!((x) => x.processHeaderLine(lineFields))(DList!(Operator))`,
    candidates are: /var/lib/buildkite-agent/builds/ci-agent-1274edee-3159-4508-b412-871bec2025b7-3/dlang/phobos/build/distribution/bin/../imports/std/algorithm/iteration.d(805):
      `each(alias fun = "a", Range)(auto ref Range range)`
      with `fun = __lambda2,
            Range = DList!(Operator)`
      must satisfy one of the following constraints:
    `       isInputRange!Range
           isArray!Range
           hasMember!(Range, "opApply")`
    

    Note: Given the role of tsv-utils in dlang CI tests, this code should not be modified until the issues raised by the Phobos PR have been resolved. In particular, does each retain backward compatibility (preferably with unit tests), or is it modified in a non-backward compatible way?

    code refactor 
    opened by jondegenhardt 0
  • Improve tsv-pretty lookahead logic [tsv-pretty mistake in column formatting.]

    Improve tsv-pretty lookahead logic [tsv-pretty mistake in column formatting.]

    I'm using tsv-utils from the arch linux aur, trying to format some word frequency data from the new general services list dataset. tsv-utils makes at least two errors that I'm able to see when I'm running this commandline:

    tsv-select -f 1,7 NGSL+1.01+with+SFI.tsv | tsv-pretty | less

    adding -s 5 to tsv-pretty works around this problem. The tsv file was converted from the file NGSL+1.01+with+SFI.xlsx available from this site: http://www.newgeneralservicelist.org/

    I'll attach NGSL+1.01+with+SFI.xlsx the original xlsx file because github won't let me post the tsv file.

    enhancement 
    opened by Jemi 8
  • How to best use the code as a library?

    How to best use the code as a library?

    I like TSV utils a lot. I'm wondering what's the best way to use the code as a library in own applications?

    Is it planned to separate the generic code-parts into a library? Maybe even add them to Phobos? IMO that would make a lot of sense too.

    enhancement question 
    opened by Robert-M-Muench 4
  • Multi-file Join

    Multi-file Join

    Hey there, been a while. :)

    I just tired to use tsv-join on a bunch of files and was very surprised when it applied the filter file to each of them in turn. Is there an approach that lets me nicely pull them all together that I've missed?

    Why?: One of the really nice things about tsv-join is, since you're working with a key, ordering doesn't matter and holes in the data can be mitigated. But it's clumsy to have to repeatedly join a whole pile of intermediate things to get an end result.

    To clarify: with the following data files...

    left

    label   v1
    foo     1
    bar     11
    baz     111
    

    centre

    label   v2
    foo     2
    bar     22
    baz     222
    

    right

    label   v3
    foo     3
    bar     33
    baz     333
    

    ...I'd like to see something like this:

    $ tsv-join -f left -k 1 left centre right
    label   v1      v2      v3
    foo     1       2       3
    bar     11      22      33
    baz     111     222     333
    

    Instead, that just prints each file in turn. (N.B. I reused the filter file as a data file because I want to preserve the column ordering.)

    Trying this instead...

    $ tsv-join -f right -k 1 -a 2 left centre
    label   v1      v3
    foo     1       3
    bar     11      33
    baz     111     333
    label   v2      v3
    foo     2       3
    bar     22      33
    baz     222     333
    

    ...closer. Sort of. (I guess?)

    This is the best I've got right now and I think it should be reliable but I haven't tested it on something substantial:

    $ tsv-select -f1 left > labels
    $ for I in left centre right; do tsv-join -f left -k1 $I | tsv-select -f2 > intermediate-$I; done
    $ paste labels intermediate-{left,centre,right}
    label   v1      v2      v3
    foo     1       2       3
    bar     11      22      33
    baz     111     222     333
    
    enhancement 
    opened by Wyatts 3
  • Column-wise maths (sum-product?)

    Column-wise maths (sum-product?)

    Hey, been a while! Just hit another thing that'd be useful for my work, so I figured I'd put it here.

    Consider the following file sample.tsv:

    script	weight	actions
    foo.js	100	6
    bar.js	600	6
    baz.js	1200	5
    qux.js	500	2
    

    If we want to know the total number of actions for each script, each second column value needs to be multiplied by the third for each line. Right now, I can get this far:

    tsv-select --fields 2,3 sample.tsv | \
        keep-header -- /bin/sh -c \
            '(sed "s/\t/ \* /" | xargs printf "%d\n" $(bc $1))'
    

    Which will give me:

    weight
    600
    3600
    6000
    1000
    

    Hm. Not quite. Better still, the rows match, but we can't join this with the current tools. We can sort of fake it with some awful circumlocutions involving number-lines:

    tsv-select --fields 2,3 sample.tsv | \
        keep-header -- /bin/sh -c \
            '(sed "s/\t/ \* /" | xargs printf "%d\n" $(bc $1))' | \
        number-lines --H | \
        tsv-join -H  -k 1 -a 2,3,4 -f <(number-lines -H sample.tsv) | \
        tsv-select -H -f 3,4,5,2
    

    gives me:

    script	weight	actions	weight
    foo.js	100	6	600
    bar.js	600	6	3600
    baz.js	1200	5	6000
    qux.js	500	2	1000
    

    Well, it's better. The new column is named wrong, though. Dang.

    More broadly, that's only multiplication. What I'd like to see is something like... this isn't really tsv-summarize, which is columnar reductions. Maybe it's an advanced selection? tsv-select -H -f1,2,3 --multiply 2:3:total_actions Or maybe it's a new tool; tsv-eval or something. Hm. :/

    enhancement 
    opened by Wyatts 3
  • tsv-summarize:

    tsv-summarize: "total line" when grouping.

    Only a small ER this time. ;)

    I hit a case where I'd like to have a "total" line in addition to the output of my --group-by. I can get it by removing the --group-by option and rerunning the input, but it'd be nice if I could get them both in one go.

    enhancement 
    opened by Wyatts 1
  • Summary bucketing to columns

    Summary bucketing to columns

    Ahaha, it keeps happening! ;) This time, in a much longer form.

    I'm not sure what to call this precisely, so I'll describe the problem and see what you think:

    Say we have as input a list of actions and their outcome:

    action                success
    frob                  true
    tweak                 true
    frob                  false
    frob                  true
    twiddle               true
    tweak                 false
    frob                  true
    

    The goal is something like this:

    action  succ    fail
    frob    3       1
    tweak   1       1
    twiddle 1       0
    

    The above was done with the following incantation:

    tsv-join -w 0 --filter-file \
        <(tsv-filter -H --str-eq 2:"false" input.tsv | tsv-summarize -H --group-by 1 --count-header fail) \
        -k 1 \
        -a 2 \
        <(tsv-filter -H --str-eq 2:"true" input.tsv | tsv-summarize -H --group-by 1 --count-header succ)
    

    This is pretty nasty: two subshells (with bonus bashisms), two scans of the input file, annoying and error-prone to edit... you can probably see why I'd like to improve this one.

    Two ideas come to mind for how this might work:

    1. A bucketing action. Something like this, perhaps: tsv-summarize --group-by 1 --bucket 2 For the above input, I'd expect this to output:
    action  success_true    success_false
    frob    3               1
    tweak   1               1
    twiddle 1               0
    

    i.e. each unique value in the group is counted and given a bucket.

    Advantages:

    • It's relatively simple. Low overhead on the user and the column names can be cleaned up with little effort.
    • It actually works for any number of unique values in the bucketed column (e.g. if I had a third "baz" status, it'd give me a column for that too).

    Disadvantages:

    • You do have to clean up the names. Given what we discussed before, I can't really think of any decent syntaxen for naming the columns in situ.
    • It may be too simple? This is just a hunch, though.
    • More feature-creep in tsv-summarize doesn't necessarily sit well with me.
    1. Some mechanism for pivoting (possibly as a new tool?). Using existing tools, we can get the following:
    $ tsv-summarize -H --group-by 1,2 --count input.tsv | sort
    action  success count
    frob    false   1
    frob    true    3
    tweak   false   1
    tweak   true    1
    twiddle true    1
    

    In this case, there needs to be something to bridge the gap. Maybe something like this? tsv-pivot --column 2 --fact sum:3

    Output... probably the same as before.

    Advantages:

    • General tool, functional for this scenario and for any other pivot operation
    • Can probably reuse a lot code, including the aggregates from tsv-summarize
    • More flexibility WRT syntax because it's a whole new tool.

    Disadvantages:

    • It's a new tool in the suite, so hooray for effort and bugs. Do I really need more disadvantages at this point?
    • ...Hahah, whoops, probably still have to clean up column names!
    enhancement 
    opened by Wyatts 2
Releases(v2.2.1)
  • v2.2.0(Mar 14, 2021)

    To download and unpack prebuilt binaries:

    $ # Linux
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v2.2.0/tsv-utils-v2.2.0_linux-x86_64_ldc2.tar.gz | tar xz
    
    $ # MacOS
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v2.2.0/tsv-utils-v2.2.0_osx-x86_64_ldc2.tar.gz | tar xz
    

    Installation instructions are in the ReleasePackageReadme.txt file in the release package.

    To be notified of new releases:

    GitHub supports notification of new releases. Click the "Watch" button on the repository page and select "Releases Only".

    Release 2.2.0 Changes:

    • tsv-filter: New feature, count matches rather than filtering (--c|count). This option causes the number of matching lines to be printed rather than the individual matching lines.
    • tsv-filter: New feature, marking records rather than filtering (--label). This option causes every record to be marked with an indication of whether it satisfied the test. Marking is done by appending a new field with an indicator value. See PR #338 for details.
    • New option: Line buffering, available in most tools (--line-buffered). This option causes each line to read and written as soon as it is available. This overrides the default buffering behavior. This is useful when reading from slow input streams. See PR #336 for details.

    Other Changes

    • Prebuilt binaries have been updated to use LDC compiler version ldc-1.24.0.
    • Changes to the LDC build parameters to better support Archlinux and other platforms. See PR #329.
    Source code(tar.gz)
    Source code(zip)
    tsv-utils-v2.2.0_linux-x86_64_ldc2.tar.gz(10.94 MB)
    tsv-utils-v2.2.0_osx-x86_64_ldc2.tar.gz(10.39 MB)
  • v2.1.2(Oct 11, 2020)

    To download and unpack prebuilt binaries:

    $ # Linux
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v2.1.2/tsv-utils-v2.1.2_linux-x86_64_ldc2.tar.gz | tar xz
    
    $ # MacOS
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v2.1.2/tsv-utils-v2.1.2_osx-x86_64_ldc2.tar.gz | tar xz
    

    Installation instructions are in the ReleasePackageReadme.txt file in the release package.

    To be notified of new releases:

    GitHub supports notification of new releases. Click the "Watch" button on the repository page and select "Releases Only".

    Release 2.1.2 Changes

    • Small performance improvement in several tools by switching from File.write to File.rawWrite. See PR #316.
    • Stopped using LDC option -disable-fp-elim. This option is no longer available starting with LDC 1.24.0 (next version) and is a required change. See PR #316.

    Prebuilt binaries have been built using the latest LDC compiler (ldc-1.23.0).

    Source code(tar.gz)
    Source code(zip)
    tsv-utils-v2.1.2_linux-x86_64_ldc2.tar.gz(10.82 MB)
    tsv-utils-v2.1.2_osx-x86_64_ldc2.tar.gz(10.20 MB)
  • v2.1.1(Sep 14, 2020)

    To download and unpack prebuilt binaries:

    $ # Linux
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v2.1.1/tsv-utils-v2.1.1_linux-x86_64_ldc2.tar.gz | tar xz
    
    $ # MacOS
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v2.1.1/tsv-utils-v2.1.1_osx-x86_64_ldc2.tar.gz | tar xz
    

    Installation instructions are in the ReleasePackageReadme.txt file in the release package.

    To be notified of new releases:

    GitHub supports notification of new releases. Click the "Watch" button on the repository page and select "Releases Only".

    Release 2.1.1 Changes

    • Improved csv2tsv buffer utilization. Enables better performance of subsequent tasks in a pipeline due to more frequent writes to standard output (better parallelization). Minor performance benefits to csv2tsv by itself. See PR #305.
    • Code change to support an upcoming D language change (minor). A tagged release with this change is needed to support tsv-utils use in the D Language project tester. See PR #306.

    Prebuilt binaries have been built using the latest LDC compiler (ldc-1.23.0).

    Source code(tar.gz)
    Source code(zip)
    tsv-utils-v2.1.1_linux-x86_64_ldc2.tar.gz(10.82 MB)
    tsv-utils-v2.1.1_osx-x86_64_ldc2.tar.gz(10.20 MB)
  • v2.1.0(Sep 8, 2020)

    To download and unpack prebuilt binaries:

    $ # Linux
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v2.1.0/tsv-utils-v2.1.0_linux-x86_64_ldc2.tar.gz | tar xz
    
    $ # MacOS
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v2.1.0/tsv-utils-v2.1.0_osx-x86_64_ldc2.tar.gz | tar xz
    

    Installation instructions are in the ReleasePackageReadme.txt file in the release package.

    To be notified of new releases:

    GitHub supports notification of new releases. Click the "Watch" button on the repository page and select "Releases Only".

    Release 2.1.0 Changes: csv2tsv

    • Performance improvements: csv2tsv is significantly faster as a result of switching to a buffer-based conversion algorithm. The 2.1.0 version runs 40-60% faster than the 2.0.0 version on tests on Mac OS, depending on the type of file. See PR #301 for details.
    • UTF-8 Byte Order Marks (BOMs) found in CSV input files are discarded when producing TSV output. See PR #302 for details.
    • TAB and Newline replacement strings can now be specified separately. Previously, only one replacement string was allowed for both newline and TAB characters in the CSV data. Now different replacements can be provided. This uses the new command line arguments --r|tab-replacement and --n|newline-replacement. See PR #303 for details.

    Other Changes

    • Prebuilt binaries have been updated to use the latest LDC compiler (ldc-1.23.0).
    Source code(tar.gz)
    Source code(zip)
    tsv-utils-v2.1.0_linux-x86_64_ldc2.tar.gz(10.82 MB)
    tsv-utils-v2.1.0_osx-x86_64_ldc2.tar.gz(10.20 MB)
  • v2.0.0(Jul 11, 2020)

    To download and unpack prebuilt binaries:

    $ # Linux
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v2.0.0/tsv-utils-v2.0.0_linux-x86_64_ldc2.tar.gz | tar xz
    
    $ # MacOS
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v2.0.0/tsv-utils-v2.0.0_osx-x86_64_ldc2.tar.gz | tar xz
    

    Installation instructions are in the ReleasePackageReadme.txt file in the release package.

    To be notified of new releases:

    GitHub supports notification of new releases. Click the "Watch" button on the repository page and select "Releases Only".

    Release 2.0.0 Changes: Named Field Support

    Release 2.0.0 adds named field support to all tools in the tsv-utils toolkit. This is a significant usability improvement.

    Named fields can be used with any file or data stream that has a header line. Named fields are enabled by the --H|header option. Field numbers can be used as well, just as in the prior versions of the toolkit. Glob-style wildcards can be used and escapes can be used to specify field names containing special characters.

    Details are available in the Field Syntax section of the Tools Reference manual.

    Examples - Assume a file with the header fields:

     1    test_name
     2    run
     3    elapsed_time
     4    user_time
     5    system_time
     6    max_memory
    

    Commands like the following can be used:

    $ # Select individual fields, like 'cut'
    $ tsv-select data.tsv -H -f user_time            # Field  4
    $ tsv-select data.tsv -H -f test_name,user_time  # Fields 1,4
    $ tsv-select data.tsv -H -f '*_time'             # Fields 3,4,5
    
    $ # Filter lines using numeric comparisons against individual fields
    $ tsv-filter data.tsv -H --lt elapsed_time:100
    $ tsv-filter data.tsv -H --gt elapsed_time:100 --lt system_time:20
    
    $ # Statistical summaries
    $ tsv-summarize data.tsv -H --median elapsed_time
    $ tsv-summarize data.tsv -H --median '*_time'
    $ tsv-summarize data.tsv -H --group-by test_name --median '*_time'
    
    $ # Uniq'ing on a field
    $ tsv-uniq data.tsv -H -f test_name 
    
    $ # Joins - Assume another file 'test_info.tsv' with 'test_name' and
    $ # 'expected_time' fields. A join can be performed using column names.
    $ tsv-join -H -f test_into.tsv data.tsv --key-fields test_name --append-fields expected_time
    

    See the reference docs or online help for details on specific tools. There is also documentation in the Tools Overview section of the main project README file.

    Named field support addresses enhancement request #25. It implemented via PRs #284 through #300.

    Other Changes

    • Prebuilt binaries have been updated to use the latest LDC compiler (ldc-1.22.0).
    Source code(tar.gz)
    Source code(zip)
    tsv-utils-v2.0.0_linux-x86_64_ldc2.tar.gz(10.81 MB)
    tsv-utils-v2.0.0_osx-x86_64_ldc2.tar.gz(10.18 MB)
  • v1.6.1(Apr 19, 2020)

    To download and unpack prebuilt binaries:

    $ # Linux
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.6.1/tsv-utils-v1.6.1_linux-x86_64_ldc2.tar.gz | tar xz
    
    $ # MacOS
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.6.1/tsv-utils-v1.6.1_osx-x86_64_ldc2.tar.gz | tar xz
    

    Installation instructions are in the ReleasePackageReadme.txt file in the release package.

    To be notified of new releases:

    GitHub supports notification of new releases. Click the "Watch" button on the repository page and select "Releases Only".

    Release 1.6.1 Changes:

    • Performance improvement to tsv-split --lines-per-file functionality (PR #280).
    • Bug fix: Detect command line entered field ranges ending with field zero (PR #279).
    • Bug fix: @safe attribution changes to enable Windows compilation of bufferedByLine (Issue #282, PR #283).
    Source code(tar.gz)
    Source code(zip)
    tsv-utils-v1.6.1_linux-x86_64_ldc2.tar.gz(10.02 MB)
    tsv-utils-v1.6.1_osx-x86_64_ldc2.tar.gz(9.22 MB)
  • v1.6.0(Mar 28, 2020)

    To download and unpack prebuilt binaries:

    $ # Linux
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.6.0/tsv-utils-v1.6.0_linux-x86_64_ldc2.tar.gz | tar xz
    
    $ # MacOS
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.6.0/tsv-utils-v1.6.0_osx-x86_64_ldc2.tar.gz | tar xz
    

    Installation instructions are in the ReleasePackageReadme.txt file in the release package.

    To be notified of new releases:

    GitHub supports notification of new releases. Click the "Watch" button on the repository page and select "Releases Only".

    Release 1.6.0 Changes:

    • Prebuilt binaries have been updated to use the latest LDC compiler (1.20.1).

    • tsv-select: New feature, the ability to exclude fields (PR #267).

      Fields to exclude are specified with the --e|exclude option. Examples:

      $ # Drop the first field, keep everything else.
      $ # Equivalent to `cut -f 2- file.tsv`
      $ tsv-select --exclude 1 file.tsv
      
      $ # Drop fields 3-10, keep everything else
      $ tsv-select --exclude 3-10 file.tsv
      

      See the tsv-select reference for more information.

    • New tool: tsv-split (PR #270)

      tsv-split is used to split one or more input files into multiple output files. There are three modes of operation:

      • Fixed number of lines per file (--l|lines-per-file NUM): Each input block of NUM lines is written to a new file. This is similar to the Unix split utility.

      • Random assignment (--n|num-files NUM): Each input line is written to a randomly selected output file. Random selection is from NUM files.

      • Random assignment by key (--n|num-files NUM, --k|key-fields FIELDS): Input lines are written to output files using fields as a key. Each unique key is randomly assigned to one of NUM output files. All lines with the same key are written to the same file.

      Examples:

      $ # Split a file into files of 10,000 lines each.
      $ tsv-split data.txt --lines-per-file 10000 --dir split_files
      
      $ # Split a file into 1000 files with lines randomly assigned.
      $ tsv-split data.txt --num-files 1000 --dir split_files
      
      # Randomly assign lines to 1000 files using field 3 as a key.
      $ tsv-split data.tsv --num-files 1000 -key-fields 3 --dir split_files
      

      See the tsv-split reference for more information.

    Source code(tar.gz)
    Source code(zip)
    tsv-utils-v1.6.0_linux-x86_64_ldc2.tar.gz(10.01 MB)
    tsv-utils-v1.6.0_osx-x86_64_ldc2.tar.gz(9.20 MB)
  • v1.5.0(Feb 16, 2020)

    To download and unpack prebuilt binaries:

    $ # Linux
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.5.0/tsv-utils-v1.5.0_linux-x86_64_ldc2.tar.gz | tar xz
    
    $ # MacOS
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.5.0/tsv-utils-v1.5.0_osx-x86_64_ldc2.tar.gz | tar xz
    

    Installation instructions are in the ReleasePackageReadme.txt file in the release package.

    To be notified of new releases:

    GitHub supports notification of new releases. Click the "Watch" button on the repository page and select "Releases Only".

    Release 1.5.0 Changes:

    • Prebuilt binaries have been updated to use the latest LDC compiler (1.20.0).

    • tsv-filter: Field list support (PR #259).

      Field list provide a compact way to specify multiple fields for a command. Most tsv-utils tools already support field lists, now tsv-filter does as well. Examples:

      $ # Select lines where fields 1-10 are not empty.
      $ tsv-filter --not-empty 1-10 data.tsv
      
      $ # Select lines where fields 1-5 and 17 are less than 100
      $ tsv-filter --lt 1-5,17:100 data.tsv
      
    • tsv-filter: New field length tests based on either characters or bytes (PR #258).

      The new operators allow filtering on field length. Field length can be measured in either characters or bytes. (Characters can occupy multiple bytes in UTF-8). Examples:

      $ # Keep only lines where field 3 is less than 50 characters
      $ tsv-filter --char-len-lt 3:50 data.tsv
      
      $ # Find lines where field 5 is more than 20 bytes
      $ tsv-filter --byte-len-gt 5:20
      

      Character length tests have names of the form: --char-len-eq|ne|lt|le|gt|ge]. Byte length tests have names of the form: --byte-len-[eq|ne|lt|le|gt|ge].

    • tsv-filter: Improved error messages when invalid regular expressions are used.

      The error message printed by tsv-filter now includes the error text provided by the D regular expression engine. This is helpful when trying to debug complex regular expressions. Examples:

      $ # Old error message (tsv-filter 1.4.4)
      $ tsv-filter --regex 4:'abc(d|e' data.tsv
      [tsv-filter] Error processing command line arguments: Invalid values in option: '--regex 4:abc(d|e'. Expected: '--regex <field>:<val>' where <field> is a number and <val> is a regular expression.
      
      $ # New error message (tsv-filter 1.5.0)
      [tsv-filter] Error processing command line arguments: Invalid regular expression: '--regex 4:abc(d|e'. no matching ')'
      Pattern with error: `abc(d|e` <--HERE-- ``
         Expected: '--regex <field>:<val>' or '--regex <field-list>:<val>' where <val> is a regular expression.
      

      The formatting of the message can be improved and is likely to be updated in the future.

    • tsv-uniq: Performance improvements (PRs #234, #235).

      Better memory management and other changes improved tsv-uniq performance by 5-35% depending on the operation.

    • tsv-sample: Performance improvements reading large data blocks from standard input (PR #238).

      Sampling and shuffling operations requiring that all data be read into memory were unnecessarily slow when large amounts of data was read from standard input. Performance issues were noticed with data sizes larger than 10 GB. This is now fixed.

    • Sample bash scripts included in release package (PR #254).

      Sample versions of the tsv-sort and tsv-sort-fast scripts described on the Tips and Tricks page are now included in the repository and in prebuilt binary packages.

    Source code(tar.gz)
    Source code(zip)
    tsv-utils-v1.5.0_linux-x86_64_ldc2.tar.gz(9.17 MB)
    tsv-utils-v1.5.0_osx-x86_64_ldc2.tar.gz(8.47 MB)
  • v1.4.4(Sep 23, 2019)

    Changes:

    • New tsv-sample option --i|inorder

      This option preserves input order when using simple or weighted random sampling. These sampling modes are engaged when a sample size is selected via the --n|num NUM option. Documentation was updated to better reflect the distinction between shuffling the full data set and random sampling which selects a subset of lines. (PR #226)

    • tsv-summarize --min and --max operators changed to preserve original input string

      The prior behavior of the operators was to read the values to a double, then use numeric formatting to print the recorded double. In some cases this would cause the original input to change, especially if it was a long format number, for example, 16 digits long. (PR #220)

      The prior behavior makes sense for calculations like mean and median, but not for min and max. In particular, preserving the original values allows them to be joined with or compared to the original data.

    • Prebuilt binaries have been updated to use the latest LDC compiler (1.17.0).

    To download and unpack the prebuilt binaries:

    $ # Linux
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.4.4/tsv-utils-v1.4.4_linux-x86_64_ldc2.tar.gz | tar xz
    
    $ # MacOS
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.4.4/tsv-utils-v1.4.4_osx-x86_64_ldc2.tar.gz | tar xz
    
    Source code(tar.gz)
    Source code(zip)
    tsv-utils-v1.4.4_linux-x86_64_ldc2.tar.gz(9.16 MB)
    tsv-utils-v1.4.4_osx-x86_64_ldc2.tar.gz(8.42 MB)
  • v1.4.3(Aug 19, 2019)

    Two changes:

    • New tsv-pretty option --a|auto-preamble - Enables automatic detection of preambles. Lines at the start of the file that should be printed as is, without reformatting into pretty printed columns. For more information and examples see PR #218.
    • Prebuilt binaries have been updated to use the latest LDC compiler (1.16.0).

    To download and unpack the prebuilt binaries:

    $ # Linux
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.4.3/tsv-utils-v1.4.3_linux-x86_64_ldc2.tar.gz | tar xz
    
    $ # MacOS
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.4.3/tsv-utils-v1.4.3_osx-x86_64_ldc2.tar.gz | tar xz
    
    Source code(tar.gz)
    Source code(zip)
    tsv-utils-v1.4.3_linux-x86_64_ldc2.tar.gz(9.09 MB)
    tsv-utils-v1.4.3_osx-x86_64_ldc2.tar.gz(8.34 MB)
  • v1.4.2(Jun 14, 2019)

    One change:

    • Fixes incorrect comma use in the dub.json file. Needed to support planned changes in dub. Also needed for dlang CI pipelines.

    There are no changes to any of the tools.

    To download and unpack the prebuilt binaries:

    $ # Linux
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.4.2/tsv-utils-v1.4.2_linux-x86_64_ldc2.tar.gz | tar xz
    
    $ # MacOS
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.4.2/tsv-utils-v1.4.2_osx-x86_64_ldc2.tar.gz | tar xz
    
    Source code(tar.gz)
    Source code(zip)
    tsv-utils-v1.4.2_linux-x86_64_ldc2.tar.gz(9.08 MB)
    tsv-utils-v1.4.2_osx-x86_64_ldc2.tar.gz(8.36 MB)
  • v1.4.1(Apr 7, 2019)

    This release contains one new feature and several performance improvements:

    • tsv-uniq --number - Line numbering grouped by key (new feature). The key is either the whole line or a subset of fields. Each unique key gets its own set of line numbers. See the tsv-uniq reference for details.
    • Improved I/O read performance. This was achieved by using a buffered version of std.stdio.File.byLine. Especially effective for narrow files. Tools using byLine (most of the tools) typically see a 10-40% performance gain, depending on tool and type of file (measured on OS X). Implementation documentation: tsv_utils.common.utils.bufferedByLine.
    • Updated compiler to LDC 1.15.0 for prebuilt binaries (frontend/druntime/phobos 2.085.1). This includes an update to LLVM 8.0 and a couple of improvements to memory allocation and GC collection. The latter improved performance of several of the tools, especially tools like tsv-join that allocate large amounts of memory.

    To download and unpack the prebuilt binaries:

    $ # Linux
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.4.1/tsv-utils-v1.4.1_linux-x86_64_ldc2.tar.gz | tar xz
    
    $ # MacOS
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.4.1/tsv-utils-v1.4.1_osx-x86_64_ldc2.tar.gz | tar xz
    
    Source code(tar.gz)
    Source code(zip)
    tsv-utils-v1.4.1_linux-x86_64_ldc2.tar.gz(9.08 MB)
    tsv-utils-v1.4.1_osx-x86_64_ldc2.tar.gz(8.36 MB)
  • v1.3.2(Nov 12, 2018)

    This release modifies tsv-sample random value printing so most values are printed in decimal notation, without exponents. This is for subsequent processing by GNU sort. Sorting numbers with exponents requires "general numeric" order (option 'g'), which is much slower than "numeric" order (option 'n'). See Shuffling large files on the Tips and Tricks page for more info.

    To download and unpack the prebuilt binaries:

    $ # Linux
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.3.2/tsv-utils-v1.3.2_linux-x86_64_ldc2.tar.gz | tar xz
    
    $ # MacOS
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.3.2/tsv-utils-v1.3.2_osx-x86_64_ldc2.tar.gz | tar xz
    
    Source code(tar.gz)
    Source code(zip)
    tsv-utils-v1.3.2_linux-x86_64_ldc2.tar.gz(11.02 MB)
    tsv-utils-v1.3.2_osx-x86_64_ldc2.tar.gz(7.99 MB)
  • v1.3.1(Nov 11, 2018)

    In this release:

    • tsv-sample: Adds full-line as key to distinct sampling. This completes the work that has been done on sampling over the last few point releases. tsv-sample now supports a fair set of sampling modes. Performance is also good, in keeping with the tradition of the other tsv-utils tools.
    • Prebuilt binaries have been updated to use the latest LDC compiler (1.12.0). This is a significant performance boost to regex search in tsv-filter. Unfortunately csv2tsv is a little slower.
    • The build system now supports using LDC's LTO compiled druntime and phobos libraries (those shipped with the compiler). This eliminates the need to download the druntime and phobos source code at build time. This is more convenient and supports package managers better.
    • Code level documentation now generates good documentation when used with the dpldocs documentation system. Go to the tsv-utils code documentation to see the result.

    To download and unpack the prebuilt binaries:

    $ # Linux
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.3.1/tsv-utils-v1.3.1_linux-x86_64_ldc2.tar.gz | tar xz
    
    $ # MacOS
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.3.1/tsv-utils-v1.3.1_osx-x86_64_ldc2.tar.gz | tar xz
    
    Source code(tar.gz)
    Source code(zip)
    tsv-utils-v1.3.1_linux-x86_64_ldc2.tar.gz(11.01 MB)
    tsv-utils-v1.3.1_osx-x86_64_ldc2.tar.gz(7.99 MB)
  • v1.2.3(Oct 21, 2018)

    This release add several new sampling algorithms that improve runtime performance and memory utilization for a number of sampling use-cases. There are no new forms of sampling, just additional algorithms. The new algorithms:

    • A skip sampling implementation of Bernoulli sampling.
    • An implementation of reservoir sampling "Algorithm R" used for unweighted random sampling.
    • A line order randomization algorithm based on array shuffling.

    Formal performance benchmarks have not been run. However, tests run on Mac OS as part of development show favorable results relative to other available tools, including GNU shuf.

    To download and unpack the prebuilt binaries:

    $ # Linux
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.2.3/tsv-utils-v1.2.3_linux-x86_64_ldc2.tar.gz | tar xz
    
    $ # MacOS
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.2.3/tsv-utils-v1.2.3_osx-x86_64_ldc2.tar.gz | tar xz
    
    Source code(tar.gz)
    Source code(zip)
    tsv-utils-v1.2.3_linux-x86_64_ldc2.tar.gz(8.72 MB)
    tsv-utils-v1.2.3_osx-x86_64_ldc2.tar.gz(8.47 MB)
  • v1.2.2(Oct 7, 2018)

    This release adds new capabilities and performance improvements to tsv-sample. Documentation was also updated to improve clarity. Key changes:

    • New feature: Simple random sampling with replacement - All lines from input sources are read in, then lines are repeated selected at random and written out. Lines can be output multiple times. The process continues until the specified number of samples has been written. Invoke using the -r|--replace and -n|--num NUM options.
    • New feature: Random value printing - A new feature was added for generating random values for all input lines. In the default case it shows the values used for Bernoulli sampling trials. It can also be used with 'distinct' sampling to show the sampling bucket a line is placed in based on the key-fields specified. This feature is invoked with the --gen-random-inorder option. A related feature, --print-random, was updated so that it is now supported by all applicable sampling modes.
    • Line order randomization performance improvements: One of the basic tsv-sample use cases is line order randomization. The case where all input lines are being permuted was re-written and is now quite a bit faster and uses less memory. This applies to both weighted and unweighted sampling. (The case where a subsampling is being done via the -n|--num option uses reservoir sampling was already fast.)
    • Command line option change - The option for specifying the probability used for Bernoulli sampling was changed from -r|--rate to -p|prob. This was done to create a more consistent set of option names for new features and features that may be added in the future.

    To download and unpack the prebuilt binaries:

    $ # Linux
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.2.2/tsv-utils-v1.2.2_linux-x86_64_ldc2.tar.gz | tar xz
    
    $ # MacOS
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.2.2/tsv-utils-v1.2.2_osx-x86_64_ldc2.tar.gz | tar xz
    
    Source code(tar.gz)
    Source code(zip)
    tsv-utils-v1.2.2_linux-x86_64_ldc2.tar.gz(8.71 MB)
    tsv-utils-v1.2.2_osx-x86_64_ldc2.tar.gz(7.87 MB)
  • v1.2.1(Aug 3, 2018)

    This release adds features for tsv-utils automated tests. There are no changes to any of the tools.

    The new testing features add support for different correct output results for different compiler/library versions. The main case is for changes to error message text, which in some cases includes text from the phobos library.

    Alternate test outputs were added for a planned change to Phobos in an upcoming release. This was bundled into a tagged release to support the D language project tester where tsv-utils is used.

    To download and unpack the prebuilt binaries:

    $ # Linux
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.2.1/tsv-utils-v1.2.1_linux-x86_64_ldc2.tar.gz | tar xz
    
    $ # MacOS
    $ curl -L https://github.com/eBay/tsv-utils/releases/download/v1.2.1/tsv-utils-v1.2.1_osx-x86_64_ldc2.tar.gz | tar xz
    
    Source code(tar.gz)
    Source code(zip)
    tsv-utils-v1.2.1_linux-x86_64_ldc2.tar.gz(8.69 MB)
    tsv-utils-v1.2.1_osx-x86_64_ldc2.tar.gz(7.84 MB)
  • v1.2.0(Jul 16, 2018)

  • v1.1.20(Jun 14, 2018)

  • v1.1.19(Mar 18, 2018)

    NOTE: Unfortunately, the pre-built binaries for v1.1.19 and earlier releases have been lost. Please use the pre-built binaries from the latest release. There is nothing wrong with the old binaries, if you downloaded one earlier you can continue to use it.

    Changes in v1.1.19:

    • tsv-uniq - New options for printing only repeated lines: --r|repeated, --a|at-least N.
    • tsv-pretty - New option for verbatim output of an initial set of lines: --a|preamble N.
    • makefile help - Bug fix in the output.
    Source code(tar.gz)
    Source code(zip)
  • v1.1.18(Feb 25, 2018)

    NOTE: Unfortunately, the pre-built binaries for v1.1.19 and earlier releases have been lost. Please use the pre-built binaries from the latest release. There is nothing wrong with the old binaries, if you downloaded one earlier you can continue to use it.

    Changes in v1.1.18:

    • tsv-uniq - Added a --m|max option to output up to a max number of duplicate lines. The default of course is one.
    • tsv-sample - Added PGO support. Small gains, up to 5% depending on sampling method.
    • Better unit test diagnostic output on "command line" tests. This simplifies tracking down errors when tests are run on a system like TravisCI. In the past it was necessary to run the test locally to see what failed.
    • Bash completion - Fix a tsv-filter option.
    • Doc updates - Added a pair of sections to the Tips and Tricks doc. One describing TSV and CSV differences, another giving examples of using dos2unix and iconv to deal with encoding and newline issues.
    Source code(tar.gz)
    Source code(zip)
  • v1.1.17(Jan 26, 2018)

    NOTE: Pre-built binaries for this release are no longer available. Please use binaries from the latest release.

    Changes in v1.1.17:

    Most of the tools were switched to use output buffering. This is a performance enhancement that works by buffering small writes into larger blocks before writing to the final output destination, usually stdout. The amount of benefit depends on the tool and the nature of the file being processed. Narrow files (short lines) see the most benefit, and in some cases run 50% faster. More typical gains are 5-20%.

    Output buffering logic is in the BufferedOutputRange struct found in common/src/tsvutil.d. The resulting source code in each tool turns out to be quite readable.

    Source code(tar.gz)
    Source code(zip)
  • v1.1.16(Jan 14, 2018)

    NOTE: Pre-built binaries for this release are no longer available. Please use binaries from the latest release.

    Changes in v1.1.16:

    The main changes in this release are the use of Profile Guided Optimization (PGO) and the addition of new sampling methods in tsv-sample.

    Profile Guided Optimization - This is a follow-on to the Link Time Optimization work done in v1.1.15. It is based on LDC compiler support for LTO and PGO, including the ability to operate on the application code and the D standard libraries (druntime, phobos) together.

    Profile Guided Optimization uses data collected from instrumented builds to better optimize executables. The tsv utilities build process has been updated to generate and use instrumentation for several of the tools. LTO and PGO builds are enabled by options passed to make. The pre-built binaries available from the GitHub releases page are built with LTO and PGO, but they must enabled explicitly when building from source. See Building with Link Time Optimization and Profile Guided Optimization for details.

    PGO results in material performance gains (10% or more) on csv2tsv and tsv-summarize, and smaller gains (2-5%) on several other tools. Considering LTO (v1.1.15) and PGO (v1.1.16) combined, performance gains on five of six measured benchmarks ranged from 8-45% on Linux, and 6-57% on MacOS. Three of the benchmarks saw gains greater than 25% on both platforms.

    New sampling methods - Two sampling methods have been added to tsv-sample. One is a simple stream sampling mode that selects a random portion of an input stream based on a sampling rate. Another is a form of sampling known as "distinct" sampling. This selects a random portion of records based on a key in the data. For example, if records contain an IP address, sampling to take all records from 1% of the unique IP addresses. See the tsv-sample reference for details.

    Other changes

    • tsv-summarize bug fix, incorrect headers on two operations.
    • Windows line ending detection when running on Unix platforms (Issue #96)
    • tsv-select performance improvement: Avoid unnecessary memory allocation from std.array.join. A 5% performance improvement and less memory allocation.
    Source code(tar.gz)
    Source code(zip)
  • v1.1.15(Nov 10, 2017)

    NOTE: Pre-built binaries for this release are no longer available. Please use binaries from the latest release.

    Changes in v1.1.15:

    This release uses new link-time optimization (LTO) available starting with the LDC 1.5 compiler release. This improves the performance of most of the tools, typically by about 10% over the previous release, and significantly more in some cases. Benchmarks can be found in this slide deck from the Silicon Valley D Meetup, Dec 14, 2017.

    Previous releases used Thin LTO on OS X builds. LTO was not used on Linux builds. In the OS X case, LTO was used on the tsv utilities code, but not the code from the D libraries, phobos and druntime.

    The LDC 1.5 release supports LTO on both Linux and OS X out of the box, and includes support for building phobos and druntime with LTO.

    This release of the tsv utilities adds support for the new LTO capabilities to the makefiles. It is not enabled by default, but can be turned on with make arguments. The prebuilt binaries have been built with LTO turned on. For more information, see Building With LTO.

    Source code(tar.gz)
    Source code(zip)
  • v1.1.15-beta3(Nov 5, 2017)

    NOTE: Pre-built binaries for this release are no longer available. Please use binaries from the latest release.

    Changes in v1.1.15-beta3: This release uses new link-time optimization (LTO) available starting with the LDC 1.5 compiler release.

    Source code(tar.gz)
    Source code(zip)
  • v1.1.14(Oct 19, 2017)

    NOTE: Pre-built binaries for this release are no longer available. Please use binaries from the latest release.

    Changes in v1.1.14:

    No functional changes, updates to documentation only.

    Source code(tar.gz)
    Source code(zip)
  • v1.1.13(Sep 23, 2017)

    NOTE: Pre-built binaries for this release are no longer available. Please use binaries from the latest release.

    Changes in v1.1.13: New tool, tsv-pretty.

    tsv-pretty prints TSV data in an aligned fasion for command-line readability. Headers are detected automatically and numeric values aligned. An example, first without formatting:

    $ cat sample.tsv
    Color   Count   Ht      Wt
    Brown   106     202.2   1.5
    Canary Yellow   7       106     0.761
    Chartreuse	1139	77.02   6.22
    Fluorescent Orange	422     1141.7  7.921
    Grey	19	140.3	1.03
    

    Now with tsv-pretty, using header underlining and float formatting:

    $ tsv-pretty -u -f sample.tsv
    Color               Count       Ht     Wt
    -----               -----       --     --
    Brown                 106   202.20  1.500
    Canary Yellow           7   106.00  0.761
    Chartreuse           1139    77.02  6.220
    Fluorescent Orange    422  1141.70  7.921
    Grey                   19   140.30  1.030
    
    Source code(tar.gz)
    Source code(zip)
  • v1.1.12(Jun 21, 2017)

    NOTE: Pre-built binaries for this release are no longer available. Please use binaries from the latest release.

    Changes in v1.1.12:

    Turn on Link Time Optimization (LTO) when using the LDC compiler on OS X. This produces faster executables. The difference is especially notable for the csv2tsv tool, which runs about 20% faster. LTO is used in the pre-built OS X binaries and will be used on OS X source code builds (git clone, dub fetch) when building with the LDC compiler.

    OS X directly supports LTO with the system linker provided by XCode (Clang / LLVM). LTO can also be used on Linux, but at present it requires installing and building special linker support. This complicates the build process, which is why it is not used on Linux by this toolset. For more information on LDC's LTO support see http://johanengelen.github.io/ldc/2016/11/10/Link-Time-Optimization-LDC.html.

    Source code(tar.gz)
    Source code(zip)
  • v1.1.11(May 8, 2017)

    NOTE: Pre-built binaries for this release are no longer available. Please use binaries from the latest release.

    Changes in v1.1.11:

    Main feature is support for field ranges. Any place a list of fields can be entered, field ranges can be used as well. A field range is a pair of field numbers separated by a hyphen. Reverse order is supported as well. Single field numbers and field ranges can be used together. Some examples:

    $ tsv-select --fields 1,2,17-33,10-7  data.tsv
    $ tsv-summarize --group-by 3-5 --median 7-17
    $ tsv-uniq --fields 7-10 data.tsv
    

    There are also some improvements to error message text.

    Source code(tar.gz)
    Source code(zip)
Owner
eBay
https://ebay.github.io/
eBay
A command-line based, minimal torrent streaming client made using Python and Webtorrent-cli. Stream your favorite shows straight from the command line.

A command-line based, minimal torrent streaming client made using Python and Webtorrent-cli. Installation pip install -r requirements.txt It use

Jonardon Hazarika 14 Nov 18, 2021
Command line, configuration and persistence utilities

Zensols Utilities Command line, configuration and persistence utilities generally used for any more than basic application. This general purpose libra

Paul Landes 1 Nov 22, 2021
topalias - Linux alias generator from bash/zsh command history with statistics, written on Python.

topalias topalias - Linux alias generator from bash/zsh command history with statistics, written on Python. Features Generate short alias for popular

Sergey Chudakov 32 Nov 21, 2021
As easy as /aitch-tee-tee-pie/ 🥧 Modern, user-friendly command-line HTTP client for the API era. JSON support, colors, sessions, downloads, plugins & more. https://twitter.com/httpie

HTTPie: human-friendly CLI HTTP client for the API era HTTPie (pronounced aitch-tee-tee-pie) is a command-line HTTP client. Its goal is to make CLI in

HTTPie 52.9k Dec 4, 2021
pyGinit is a command line tools that help you to initialize your current project a local git repo and remote repo

pyGinit pyGinit is a command line tools that help you to initialize your current project a local git repo and remote repo Requirements Requirements be

AlphaBeta 14 Nov 30, 2021
A cd command that learns - easily navigate directories from the command line

NAME autojump - a faster way to navigate your filesystem DESCRIPTION autojump is a faster way to navigate your filesystem. It works by maintaining a d

William Ting 13.2k Dec 1, 2021
AML Command Transfer. A lightweight tool to transfer any command line to Azure Machine Learning Services

AML Command Transfer (ACT) ACT is a lightweight tool to transfer any command from the local machine to AML or ITP, both of which are Azure Machine Lea

Microsoft 5 Dec 2, 2021
GDBIGtools: A command line tools for GDBIG varaints browser

GDBIGtools: A command line tools for GDBIG varaints browser Introduction Born in Guangzhou Cohort Study Genome Research Database is based on thousands

广州市出生队列基因组学研究(The genomics study of BIGCS) 6 Oct 19, 2021
A command-line tool to upload local files and pastebin pastes to your mega account, without signing in anywhere

A command-line tool to upload local files and pastebin pastes to your mega account, without signing in anywhere

ADI 1 Nov 29, 2021
commandpack - A package of modules for working with commands, command packages, files with command packages.

commandpack Help the project financially: Donate: https://smartlegion.github.io/donate/ Yandex Money: https://yoomoney.ru/to/4100115206129186 PayPal:

null 4 Sep 4, 2021
bsp_tool provides a Command Line Interface for analysing .bsp files

bsp_tool Python library for analysing .bsp files bsp_tool provides a Command Line Interface for analysing .bsp files Current development is focused on

Jared Ketterer 31 Nov 30, 2021
A simple command line tool for changing the icons of folders or files on MacOS.

Mac OS File Icon Changer Description A small and simple script to quickly change large amounts or a few files and folders icons to easily customize th

Eroxl 1 Nov 7, 2021
Convert ACSM files to DRM-free EPUB files with one command on Linux

Knock Convert ACSM files to DRM-free EPUB files using one command. This software does not utilize Adobe Digital Editions nor Wine. It is completely fr

Benton Edmondson 95 Nov 25, 2021
Python and data science snippets on the command line

Python Snippet Tool A tool to get Python and data science snippets at Data Science Simplified on the command line. You can read my article to learn ho

Khuyen Tran 15 Nov 30, 2021
A Python module and command line utility for working with web archive data using the WACZ format specification

py-wacz The py-wacz repository contains a Python module and command line utility for working with web archive data using the WACZ format specification

Webrecorder 2 Nov 5, 2021
Amazon Scraper: A command-line tool for scraping Amazon product data

Amazon Product Scraper: 2021 Description A command-line tool for scraping Amazon product data to CSV or JSON format(s). Requirements Python 3 pip3 Ins

null 49 Nov 15, 2021
Unofficial Open Corporates CLI: OpenCorporates is a website that shares data on corporations under the copyleft Open Database License. This is an unofficial open corporates python command line tool.

Unofficial Open Corporates CLI OpenCorporates is a website that shares data on corporations under the copyleft Open Database License. This is an unoff

Richard Mwewa 13 Nov 26, 2021
Rover is a command line interface application that allows through browse through mission data, images, metadata from the NASA Official Website

?? rover Rover is a command line interface application that allows through browse through mission data, images, metadata from the NASA Official Websit

Saketha Ramanjam 3 Oct 23, 2021
A command line tool that creates a super timeline from SentinelOne's Deep Visibility data

S1SuperTimeline A command line tool that creates a super timeline from SentinelOne's Deep Visibility data What does it do? The script accepts a S1QL q

Juan Ortega 2 Dec 2, 2021