Grep 每次都重定向到不同的文件名的多个文件

jty*_*yun 11 grep bash io-redirection filenames

我有一个充满 .tsv 文件的目录,我想对每个文件运行 grep 命令以提取特定的文本行组,然后将其保存到具有相似文件名的关联文本文件中。例如,如果我只对其中一个文件进行 grep,我的 grep 命令如下所示:

grep -h 8-K 2008-QTR1.tsv > 2008Q1.txt
Run Code Online (Sandbox Code Playgroud)

但我有一个 tsv 文件列表,如下所示:

2008-QTR1.tsv
2008-QTR2.tsv
2008-QTR3.tsv
2008-QTR4.tsv
2009-QTR1.tsv
2009-QTR2.tsv
2009-QTR3.tsv
...
Run Code Online (Sandbox Code Playgroud)

在 grepping 之后,它们需要存储为:

2008Q1.txt
2008Q2.txt
2008Q3.txt
2008Q4.txt
2009Q1.txt
2009Q2.txt
2009Q3.txt
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

Jef*_*ler 12

在 ksh93/bash/zsh 中,用一个简单的for循环和参数扩展:

for f in *-QTR*.tsv
do 
  grep 8-K < "$f" > "${f:0:4}"Q"${f:8:1}".txt
done
Run Code Online (Sandbox Code Playgroud)

这一次运行grep一个文件(该文件列表是从通配符模式生成的,该模式要求文件名中存在“-QTR”以及以文件名结尾的“.tsv”),将输出重定向到精心构建的文件名基于:

  • 文件名的前四个字符——年份
  • Q
  • 文件名的第 9 个字符——季度

  • @D.BenKnoble Stéphane 编辑了它,但如果您想要一致的错误消息(来自您的 shell,而不是来自各种实用程序),它会很有用;另见 https://unix.stackexchange.com/a/458268/117549 (2认同)

Sté*_*las 5

强制性的 POSIXsh变体:

#! /bin/sh -
ret=0
for file in [[:digit:]][[:digit:]][[:digit:]][[:digit:]]-QTR[1234].tsv; do
  base=${file%.tsv}
  grep 8-K < "$file" > "${base%%-*}Q${base##*-QTR}".txt || ret=$?
done
exit "$ret"
Run Code Online (Sandbox Code Playgroud)