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
强制性的 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)