GithubHelp home page GithubHelp logo

ebay / tsv-utils Goto Github PK

View Code? Open in Web Editor NEW
1.4K 38.0 78.0 2.83 MB

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

Home Page: https://ebay.github.io/tsv-utils/

License: Boost Software License 1.0

D 79.74% Makefile 2.22% Shell 18.04%
csv command-line dlang data-science tabular-data cli delimited-files sampling tsv statistics

tsv-utils's Introduction

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 <user, query, clicked-url> 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<suffix>, with NNN being a number and <suffix> 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.

tsv-utils's People

Contributors

abonner avatar bewuethr avatar burner avatar johanengelen avatar jondegenhardt avatar mark-summerfield avatar n8sh avatar wilzbach avatar wu-zhe avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tsv-utils's Issues

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

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.

Add some way to split a field

Another feature request that came to mind as I was working. Consider the following single column of data:

file
5core_05thread
5core_06thread
5core_07thread
5core_08thread

I ended up doing it in post-process, but I think it'd be handy to have some way to split fields so that it comes out like this:

cores  threads
5      5
5      6
5      7
5      8

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. :/

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.

why dub_build start automatically ?(curious)

Your tsv tools are handy, but I have a more curious question: after cloning, I run dub only and everything compiled. What mechanism allows dub_build binary to execute by itself? At first I thought it has something to do with postGenerateCommands, but could not find any trace of that in the repo. So please teach me :)

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.

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!

Inconsistent newline handling on Windows

This is a follow-on to issue #307, which identified issues with newline handling on Windows.

Note: Windows is not a currently supported platform. However, it is certainly desirable to have it run on Windows, making it worthwhile to identify issues needing to be addressed on Windows.

The general problem is that the different read and write mechanisms used in the different tsv-utils tools are not consistent with respect to handling of newlines on the Windows platform. In some cases files are read in binary mode, in other cases in text mode. Similar for writing. (Text mode engages newline translation on Windows in the low-level I/O routines.) At present the exact behavior of each tool is not known, this requires further evaluation.

There are a couple things that need to be done. One is to have complete test suite. The other is to choose newline policies. These would tested in the test suite.

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.

The simplest policy to support would be to restrict the tools to Unix newlines. Require Unix newlines on input and output only Unix newlines. The existing test suite would largely support this. And, it would be the correct choice in many environments, especially in circumstances where a mix of Unix and Windows platforms are in use. That is, if data files are being shared, Unix newlines will normally be preferred.

Reading either form (option 3) 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.

Full customization of newline handling has a material downside, in that it create additional user complexity in the form of additional command line arguments.

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.

Good utility to test ring buffer?

I have added a new type of buffer to iopipe that allows me to avoid copying at all (even when the buffer needs to be reused). It works by using some mmap magic that @DmitryOlshansky clued me into at dconf.

However, I have discovered after getting it to work, that it's performance is pretty much equivalent to the original buffer type. The reason is that my "big test case" is byline, and byline copies very little data to begin with (and not very often). I wondered if you have any utilities that would benefit from such a buffer? Basically I'm looking for an example case that keeps a lot of data in the buffer at a time.

If you don't have any, I'm going to implement an example of keeping N lines in buffer at once (think of a grep-style iopipe that can be used to print N lines of context around the match). I think this should show some significant difference, but I wondered if you had examples that would be relevant in this library?

Q: any API doc? how to skip empty field in csvReader?

https://forum.dlang.org/thread/[email protected]

If there is any API doc?

Readme only has command line doc.

BTW, how to skip empty field in csvReader? E.g. how to achieve the following in this library? Thanks.

https://run.dlang.io/is/9afmT1

void main()
{
    import std.csv;
    import std.stdio: write, writeln, writef, writefln;
    import std.algorithm.comparison : equal;
    string text = "Hello;65;;\nWorld;123;7.5";
    struct Layout
    {
        string name;
        int value;
        double other;
    }

    auto records = text.csvReader!Layout(';');
    assert(records.equal([
        Layout("Hello", 65, 2.5),
        Layout("World", 123, 7.5),
    ]));


}

There is an empty field in the 1st line: "Hello;65;;", then

std.csv.CSVException@/dlang/dmd/linux/bin64/../../src/phobos/std/csv.d(1232): Floating point conversion error for input "".

Is there a way to tell csvReader to skip such empty fields?

why don't you use mmfile?

A couple of weeks ago I did a (noobish) benchmark that compared different D functions with C, C++ and Python.
By far the fastest was the following code:

scope mmFile = new MmFile(args[1]);
auto file = splitter(cast(string)mmFile[0..mmFile.length], '\n').filter!"!a.empty";
file.popFront; // header
// parse body (or whatever you want to do with it)
foreach(line; file){
        int[] csv = line.splitter(' ').map!(to!int).array;
        counter += csv.sum;

I am just wondering whether you just didn't know about this or there was any reason against it.
Memory-mapping also works well with extremely large files.

https://dlang.org/phobos/std_mmfile.html
https://en.wikipedia.org/wiki/Memory-mapped_file

Ability to produce proper CSV files

We have a need to clean up CSV files and produce comma delimited files (not tab delimited). If the data has commas embedded in the fields, those fields should be quoted.

Currently it's possible to set the tsv-delimiter to comma, but this would also replace any commas in the source data with spaces, which is not what we want.

The goal of this exercise is to basically go from QUOTE_ALL to QUOTE_MINIMAL for the CSV files.

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.

Sort using column names

How to sort using column names instead of indices? e.g. tsv-sort -H -k age:nr -k name instead of keep-header -- sort -t $'\t' -k 2,2nr -k 1,1

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.

Print tool name with error message

Hey there, been a while! Just noticed that something I thought should work doesn't. But at what point in the pipeline did things go wrong? So I had to remove things one at a time until the bug unfurled. I'd like it if error messages printed their name before the error. e.g.
[csv2tsv] Error: Not enough fields in line. File: Standard Input, Line: 3

tsv-select: Inverse selection

I'm on fire! :D Just thought of this while I was writing #71: a way to drop columns instead of select them would probably be even clearer in many cases. Consider:
tsv-select -f 1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,17,$(seq -s, 19 49) rawdata.tsv
vs.
tsv-select --inverse -f 9,18 rawdata.tsv
...or better:
tsv-select --inverse 9,18 rawdata.tsv
...because you may want to rearrange what's left:
tsv-select -v 9,18 -f 1,43,38 -r last (short option -v, like grep)
In the above example 9 and 18 are still not part of the output despite the -r last, and numbering doesn't shift for other addressing (i.e. 43 wasn't 45 before columns were removed).

Of course, it'd pair well with ranges, too, so they're not mutually exclusive:
tsv-select -v 2-9

Trying to include and exclude a field at the same time... should probably just be an error, though that could be annoying at times.

I'm not sold on the name/shortening, either. It'd make more sense for my initial thought (tsv-select -inverse -f 9,18), than the form I'd consider more usable.

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.

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                                                                    

keep-header missing dub.json

When I run dub in tsv-utils to build, I get this:

Stevens-MacBook-Pro:tsv-utils-dlang steves$ dub
Unknown dependency: tsv-utils-dlang:keep-header
Stevens-MacBook-Pro:tsv-utils-dlang steves$ 

Looks like the dub.json file is missing in the keep-header directory. I can mock up one based on another dub.json, but the real description/etc I'd prefer you to make.

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";
};

bufferedByLine does not work with File due to @safe <> @system conflict

This is the first time I am using tsv-utils. I am trying to compile the following chunk of code:

import std.stdio;
import std.typecons : Yes, No;
import tsv_utils.common.utils : bufferedByLine;

enum testFile = "test.tsv";

void main(string[] args)
{
    foreach (line; testFile.File().bufferedByLine!(Yes.keepTerminator))
    {
        writeln(line);
    }
}

and get the following exception:

> dub build --single preprocessor.d --compiler=ldc2 --force
Performing "debug" build using ldc2 for x86_64.
mir-core 1.1.2: building configuration "library"...
mir-algorithm 3.7.28: building configuration "default"...
preprocessor ~master: building configuration "application"...
C:\Users\tasty\AppData\Local\dub\packages\tsv-utils-1.6.0\tsv-utils\common\src\tsv_utils\common\utils.d(899,38): Error: @safe function tsv_utils.common.util
s.bufferedByLine!(cast(Flag)true, char, cast(ubyte)10u, 131072LU, 16384LU).bufferedByLine.BufferedByLineImpl.popFront cannot call @system function std.stdio
.File.rawRead!ubyte.rawRead
C:\ldc2-1.20.0-windows-x64\bin\..\import\std\stdio.d(1076,9):        std.stdio.File.rawRead!ubyte.rawRead is declared here
preprocessor.d(29,40): Error: template instance tsv_utils.common.utils.bufferedByLine!(cast(Flag)true, char, cast(ubyte)10u, 131072LU, 16384LU) error instan
tiating
ldc2 failed with exit code 1.

Am I using it correctly?

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.

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:

  • Build (compile/link) w/ dub, DMD 64-bit - Done (passses)
  • Build (compile/link) w/ dub, LDC 64-bit - Done (passses)
  • Build (compile/link) w/ make, DMD 64-bit - Done (passses)
  • Build (compile/link) w/ make, LDC 64-bit - Done (passses)
  • 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:

  • 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.

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.

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

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?

Field ranges

I think it'd be a boon to usability if we could specify ranges of fields similarly to the shell tool cut. Especially for something like this:

tsv-select -f 1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,17,$(seq -s, 19 49)

It would be more familiar and more readable to be able to render it like so:

tsv-select -f 1-10,12-17,19-

This becomes especially nice when you have a lot of columns.

And there's the hat trick. ;)

Build tsv-filter failure

$ dub run tsv-utils-dlang
Building package tsv-utils-dlang in /home/mab/.dub/packages/tsv-utils-dlang-1.0.7/tsv-utils-dlang/
Performing "debug" build using dmd for x86_64.
tsv-utils-dlang:csv2tsv 1.0.7: building configuration "unittest"...
tsv-utils-dlang 1.0.7: building configuration "executable"...
Linking...
Running .dub/packages/tsv-utils-dlang-1.0.7/tsv-utils-dlang/dub_build 

=== Building tsv-utils-dlang executables ===

Building csv2tsv

dub build tsv-utils-dlang:csv2tsv --force -b release
Building package tsv-utils-dlang:csv2tsv in /home/mab/.dub/packages/tsv-utils-dlang-1.0.7/tsv-utils-dlang/csv2tsv/
Performing "release" build using dmd for x86_64.
tsv-utils-dlang:csv2tsv 1.0.7: building configuration "executable"...
Linking...

Building number-lines

dub build tsv-utils-dlang:number-lines --force -b release
Building package tsv-utils-dlang:number-lines in /home/mab/.dub/packages/tsv-utils-dlang-1.0.7/tsv-utils-dlang/number-lines/
Performing "release" build using dmd for x86_64.
tsv-utils-dlang:number-lines 1.0.7: building configuration "executable"...
Linking...

Building tsv-filter

dub build tsv-utils-dlang:tsv-filter --force -b release
Building package tsv-utils-dlang:tsv-filter in /home/mab/.dub/packages/tsv-utils-dlang-1.0.7/tsv-utils-dlang/tsv-filter/
Performing "release" build using dmd for x86_64.
tsv-utils-dlang:tsv-filter 1.0.7: building configuration "executable"...
.dub/packages/tsv-utils-dlang-1.0.7/tsv-utils-dlang/tsv-filter/src/tsv-filter.d(532,16): Error: module getopt_inorder is in file 'getopt_inorder.d' which cannot be read
import path[0] = .dub/packages/tsv-utils-dlang-1.0.7/tsv-utils-dlang/tsv-filter/src/
import path[1] = /usr/include/dlang/dmd
dmd failed with exit code 1.


===> Build failure.

Program exited with code 2

tsv-append: limit number of rows per file? [feature request]

tsv-append is useful for combining several tsv files each with a header line.

However, very often one does this and also wants to combine only the top ki lines of the ith file (e.g. after all those files have been sorted by some criterion).

This can of course be in several steps but since tsv-append already exists, adding a way to do this with this command would make it easy to do this in one easy to understand step.

One way to implement this perhaps would be to make source tracking with -f optional and allow to enable "top-n" processing:

  • enable top-n processing using -T/--topn
  • if -t is specified, specify each file as -f STR=FILE:N
  • if -t is not specified, specify each file as -f FILE:N
  • alternately, specify files without -f as FILE:N

So whenever -T/--topn is specified, if a file ends in ":[0-9]+" then this suffix is used to specify the number of top data rows to include (maximally, if the file is shorter, include everything there is).

Add code coverage reports to travis-ci

@wilzbach Do you have suggestions on adding code coverage reports to the travis-ci builds? I'm trying to figure out the provider and what I need to do to construct the report files.

My tests use both unit tests and runs against the command line executable. I expect I'll need to generate reports from both unit tests and each call against the executable and create and aggregated coverage reports for each file. This will happen for each tool subdirectory in the repo.

Since I have multiple executables in the repo, I'm expecting that I'll need to do a final aggregation & copy of the *.lst files up to the top-level of the repo. Does this sound right? Best I can tell, the code coverage integrators with D support look for DMD *.lst coverage report files in the top level directory.

I'd appreciate any suggestions you have on this provider selection and the procedure I outlined.

AUR package with LTO & PGO enabled

@wilzbach Hi Seb,

It's great to have tsv-utils available via a package manager distribution, but it's been a while since it's been updated. Could you update it when you get a chance?

There's another reason for doing it now. With the 1.3.1 tsv-utils release it should be possible to build the AUR package using LTO & PGO using LDC as shipped. There is no longer a need to use the ldc-build-runtime tool, that's as of LDC 1.9.0 and later. This was the issue when you put together the first version of the AUR package (#98).

tsv-utils 1.3.1 now supports building with the LTO compiled druntime/phobos libs. That enables PGO also. To build this way:

make DCOMPILER=ldc2 LDC_LTO_RUNTIME=1 LDC_PGO=2

I've tested this on a couple of ubuntu versions, but not on ArchLinux. The test suite is pretty easy to run. After the above build line run:

make test-nobuild DCOMPILER=ldc2

It'd be great if you got a chance to do this. I don't know if there are other package manager distributions shipping with LDC's LTO enabled, but it'd be nice to get have some examples to point to. Homebrew is another example where this form of LTO build would be more consistent with their build policies, as there is no file download when building.

Column-wise 1:1 append

Haha, while writing #68, I realised a couple other ones. This time, I realised there's no easy way to simply append a column to a TSV, as far as I can tell. Maybe something like this:

$ cat sample.tsv
foo	1	2
foo	3	22
foo	5	222
$ tsv-join --append sample.tsv sample.tsv
foo	1	2	foo	1	2
foo	3	22	foo	3	22
foo	5	222	foo	5	222

No filter file, just a line-by-line append. This would be useful for the cases where I want to calculate some sort of derived column and append it to the original file at the end of my pipeline or a periodic addition of new aggregated data in a time-series.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.