基本上我有一个目录和子目录需要扫描才能找到.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,但我的例子不使用正则表达式。当我将其应用于我的特定场景时,我将在搜索中使用正则表达式,因此在命名新文件时可能需要考虑这一点。如果这看起来太难了,那么一个不考虑正则表达式的答案就没问题了。
提前致谢!
答案 0 :(得分:1)
你可以试试这个:
$ find . -type f -exec grep -H foo '{}' \; | perl -ne '`echo $2 >> $1_foo` if /(.*):(.*)/'
它使用:
find
迭代文件grep
打印file path:line
元组(-H
切换)perl
将这些行回显到输出文件(使用反斜杠,但它可以做得更漂亮)。答案 1 :(得分:1)
您也可以尝试:
find -type f -name "*.csv" -a ! -name "*_foo.csv" | while read f; do
grep foo "$f" > "${f%.csv}_foo.csv"
done
答案 2 :(得分:1)
尝试这个,无论如何都要帮助它。
find -type f -name "*.csv" | xargs -I {} sh -c 'filen=`echo {} | sed 's/.csv//' | sed "s/.\///"` && egrep -i "foo" {} > ${filen}_foo.log'