1

基本上我有一个目录和子目录需要扫描以查找 .csv 文件。从那里我想将所有包含“foo”的行从找到的csv复制到新文件(与原始文件在同一目录中),但名称反映了它所在的文件。

到目前为止我有

find -type f -name "*.csv" | xargs egrep -i "foo" > foo.csv

这会产生一个包含所有内容的备份文件 (foo.csv),并且找到它的位置是数据的一部分。这两个我都不想要。

我想要的是:

例如,如果我有:

csv1.csv
csv2.csv

并且它们都有包含“foo”的行,我希望将这些行复制到:

csv1_foo.csv
csv2_foo.csv

除了原始文件中包含“foo”的整行之外,我没有在备份中输入任何额外内容。即我不想要备份数据中的原始文件名,这是我当前的代码所做的。

另外,我想我应该注意我使用的是 egrep,但我的示例没有使用正则表达式。当我将正则表达式应用于我的特定场景时,我将在搜索中使用它,因此在命名新文件时可能需要考虑到这一点。如果这看起来太难了,那么不考虑正则表达式的答案就可以了。

提前谢谢!

4

3 回答 3

1

你可以试试这个:

$ find . -type f -exec grep -H foo '{}' \; | perl -ne '`echo $2 >> $1_foo` if /(.*):(.*)/'

它用:

  • find遍历文件
  • grep打印file path:line元组(-H开关)
  • perl将这些行回显到输出文件(使用反斜杠,但可以做得更漂亮)。
于 2013-04-04T13:15:47.067 回答
1

你也可以试试:

find -type f -name "*.csv" -a ! -name "*_foo.csv" | while read f; do
   grep foo "$f" > "${f%.csv}_foo.csv"
done
于 2013-04-04T14:09:39.153 回答
1

试试这个,如果有帮助的话。

find -type f -name "*.csv" | xargs -I {} sh -c 'filen=`echo {} | sed 's/.csv//' | sed "s/.\///"` && egrep -i "foo" {} > ${filen}_foo.log'
于 2013-04-04T14:39:30.843 回答