be4311c07e14feb728abc6425ee606ffaa611a58
markd
  Fri Jan 22 06:46:58 2021 -0800
merge with master

diff --git src/utils/matrixTrim/matrixTrim.c src/utils/matrixTrim/matrixTrim.c
new file mode 100644
index 0000000..1a63378
--- /dev/null
+++ src/utils/matrixTrim/matrixTrim.c
@@ -0,0 +1,123 @@
+/* matrixTrim - Remove some or all of a matrix.. */
+#include "common.h"
+#include "linefile.h"
+#include "hash.h"
+#include "options.h"
+#include "obscure.h"
+
+void usage()
+/* Explain usage and exit. */
+{
+errAbort(
+  "matrixTrim - Remove some or all of a matrix.\n"
+  "usage:\n"
+  "   matrixTrim command inMatrix outMatrix\n"
+  "different commands:\n"
+  "   labels - removes first row and first column\n"
+  "   zeroRows - removes all zero rows\n"
+//  "   zeroCols - removes all zero columns\n"
+//  "   zeroZero - removes all zero rows and all zero columns\n"
+  "options:\n"
+  "   -unlabeled - matrix lacks label first row and column\n"
+  );
+}
+
+/* Command line validation table. */
+static struct optionSpec options[] = {
+   {"unlabeled", OPTION_BOOLEAN},
+   {NULL, 0},
+};
+
+boolean clUnlabeled = FALSE;
+
+void matrixTrimLabels(char *in, char *out)
+/* Do copy around labels */
+{
+struct lineFile *lf = lineFileOpen(in, TRUE);
+char *line;
+FILE *f = mustOpen(out, "w");
+boolean labeled = !clUnlabeled;
+
+// Skip over label row
+if (labeled)
+    lineFileNeedNext(lf, &line, NULL);
+
+while (lineFileNext(lf, &line, NULL) )
+    {
+    if (labeled)
+	{
+	line = strchr(line, '\t');
+	if (line == NULL)
+	    errAbort("Short line %d of %s", lf->lineIx, lf->fileName);
+	line += 1;
+	}
+    fputs(line, f);
+    fputc('\n', f);
+    }
+carefulClose(&f);
+lineFileClose(&lf);
+}
+
+void matrixTrimZeroRows(char *in, char *out)
+/* Trim rows that are all zero */
+{
+struct lineFile *lf = lineFileOpen(in, TRUE);
+char *line;
+FILE *f = mustOpen(out, "w");
+boolean labeled = !clUnlabeled;
+
+// Copy over label row
+if (labeled)
+    {
+    lineFileNeedNext(lf, &line, NULL);
+    fprintf(f, "%s\n", line);
+    }
+
+while (lineFileNext(lf, &line, NULL) )
+    {
+    char *label = NULL;
+    if (labeled)
+	label = nextTabWord(&line);
+    boolean allZero = TRUE;
+    if (line != NULL)
+        {
+	char *s = line;
+	while (s[0] == '0' && s[1] == '\t')
+	    s += 2;
+	allZero = (s[0] == '0' && s[1] == 0);
+	}
+    if (!allZero)
+        {
+	if (label != NULL)
+	     fprintf(f, "%s\t", label);
+	fprintf(f, "%s\n", line);
+	}
+    }
+carefulClose(&f);
+lineFileClose(&lf);
+}
+
+
+
+void matrixTrim(char *command, char *in, char *out)
+/* matrixTrim - Remove some or all of a matrix.. */
+{
+if (sameString(command, "labels"))
+    matrixTrimLabels(in, out);
+else if (sameString(command, "zeroRows"))
+    matrixTrimZeroRows(in, out);
+else
+    errAbort("Unrecognized command %s", command);
+}
+
+int main(int argc, char *argv[])
+/* Process command line and call trimming engine. */
+{
+optionInit(&argc, argv, options);
+if (argc != 4)
+    usage();
+clUnlabeled = optionExists("unlabeled");
+matrixTrim(argv[1], argv[2], argv[3]);
+
+return 0;
+}