我正在尝试使用 csvgrep (csvkit 的一部分)来提取与两个文件之一匹配的行。不幸的是,没有命令行选项允许两个匹配的文件(如 grep 那样)。仅有的,
csvgrep -f list1.txt -c 2 myfile.csv
有没有办法将 list1.txt 与 list2.txt 作为命令的一部分连接起来?
csvgrep -f (list1.txt+list2.txt) -c 2 myfile.csv
我能想到的唯一方法是使用临时中间文件,但如果可能的话我宁愿避免这样做。
答案1
假设您希望命令看到一个“文件名”,该文件名在读取时给出两个文件的内容,然后处理替换并且cat
是您想要的:
csvgrep -f <(cat list1.txt list2.txt) -c 2 myfile.csv
基本上,进程替换是一个通用管道,它在内部运行命令,并安排它们的输出通过可以像任何常规文件一样打开的魔术文件提供。扩展本身扩展为该魔术文件的名称。 (即echo <(echo foo)
打印类似/dev/fd/63
, 并cat <(echo foo)
打印foo
。)
答案2
许多程序允许-
用作文件名来表示标准输入或输出(取决于它是输入文件还是输出文件)。因此,您可以尝试通过管道传输csvgrep
并使用-f -
.
cat list1.txt list2.txt | csvgrep -f - -c 2 myfile.csv
如果它有效,它比进程替换方法有优势,因为它不依赖于特定于 shell 的扩展。
如果这不起作用,您可以使用/dev/stdin
.这是一个标准的 Linux 设备,自动引用进程的标准输入。
请注意,所有这些解决方案都依赖于csvgrep
不需要在-f
文件中查找,因为 的输出cat
是通过管道发送的。但这似乎是一个安全的假设。