文件匹配模式递归的唯一 headers 列表

List of unique headers recursively on files matching pattern

我想要一组 csv 文件的唯一 headers,这些文件的名称包含 ABCXYZ.

在一个目录中,我可以通过以下方式获得我需要的内容:

head -n ` *.csv > first.txt
cat -A first.txt | tr ',' '\n' | sort | uniq

当然,这不是递归的,它包括 所有 csv 个文件,而不仅仅是我想要的文件。

如果我执行以下操作,我得到了递归搜索,但也是一堆垃圾:

find . -type f -name "ABC*.csv" -o -name "XYZ*.csv" | xargs head -n 1 | tr ',' '\n' | sort | uniq

我在 Windows 10 上使用 MinGW64。我想我可以使用 Python,但我感觉离拥有它太近了!

head 被赋予多个文件时(xargs 这样做)它也会打印它们的名字。

使用find-exec操作(你应该强制-name 'ABC*.csv' -o -name 'XYZ*.csv的优先级才能工作)你可以获得想要的结果。 uniq 在这里也不是必需的,排序可以自己完成。作为旁注,您最好将文字字符串括在单引号中。

find . -type f \( -name 'ABC*.csv' -o -name 'XYZ*.csv' \) -exec head -n 1 {} \; | tr ',' '\n' | sort -u

如果你的文件有 DOS 行结尾,上面的命令将不起作用。在这种情况下,您应该使用 trsed:

删除回车符 returns
find . -type f \( -name 'ABC*.csv' -o -name 'XYZ*.csv' \) -exec head -n 1 {} \; | tr -d '\r' | tr ',' '\n' | sort -u
# or
find . -type f \( -name 'ABC*.csv' -o -name 'XYZ*.csv' \) -exec head -n 1 {} \; | sed 's/\r//; s/,/\n/g' | sort -u