【问题标题】:BASH how to filenames from a file and zcat themBASH如何从文件中获取文件名并zcat它们
【发布时间】:2018-12-19 13:59:15
【问题描述】:

假设我有一个目录,内容如下:

$ ls
file1.csv.gz
file2.csv.gz
file3.csv.gz
file4.csv.gz
listOfFiles.txt

listOfFiles.txt 包含我想要 zcat 和管道到 awk 以处理其内容的文件列表。例如,listOfFiles.txt 可能包含以下内容:

$ cat listOfFiles.txt
file2.csv.gz
file3.csv.gz

在这种情况下,我希望 zcat 对 file2.csv.gz 和 file3.csv.gz 进行操作,而不是对目录中的任何其他文件进行操作。一种方法是(编辑:根据 cmets 从xargs zcat {} 中删除{}):

cat listOfFiles.txt | xargs zcat | awk ...

但我想知道是否有更简洁的方式让zcat 可以从listOfFiles.txt 读取文件名。它必须能够处理任意长的文件名列表,xargs 处理得很好,理想情况下,它只会为listOfFiles.txt 的全部内容调用一次zcat,而不是@987654334 中包含的每个文件一次@。

【问题讨论】:

  • 既然你说列表可以任意长,我没有看到比xargs更好的解决方案来减少对zcat的调用次数。
  • 需要明确的是,xargs 已经在默认情况下尝试将参数合并到尽可能少的命令调用中,因此它将运行zcat file2.csv.gz file3.csv.gz——而不是zcat file2.csv.gz,然后是@ 987654340@ -- 如果调用时使用完整的默认值(无 -I-J-n 等)。 {} 仅在 -I {} 前面才有意义,但最佳做法是不要在此处使用该选项。

标签: bash xargs zcat


【解决方案1】:

你可以避开cat

xargs zcat < listOfFiles.txt | awk ...

【讨论】:

  • -I 形式效率较低,因为它暗示了-n 1。有什么理由在这里使用它吗?
  • (此外,OP 明确希望尽可能少地调用zcat,省略-I 有助于服务)。
  • 但你是对的,为什么答案会显示低效的选项
猜你喜欢
  • 2018-07-06
  • 2011-08-30
  • 2013-04-18
  • 2016-03-05
  • 1970-01-01
  • 2020-09-02
  • 2023-04-04
  • 2010-10-12
  • 1970-01-01
相关资源
最近更新 更多