2013-04-04 20 views
1

基本上我有一個目錄和子目錄,需要掃描才能找到.csv文件。從那裏,我想複製包含發現新文件(在相同的目錄原件)從CSV的「富」,但這個名字反映了它在發現文件中的所有行。如何創建包含「foo」的文件行的備份

到目前爲止,我有

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,但我的例子不使用正則表達式。當我將它應用於特定場景時,我將在搜索中使用正則表達式,因此在命名新文件時可能需要考慮這一點。如果這看起來太困難了,一個沒有考慮正則表達式的答案會很好。

提前致謝!

回答

1

試試這個,如果反正幫助它。

find -type f -name "*.csv" | xargs -I {} sh -c 'filen=`echo {} | sed 's/.csv//' | sed "s/.\///"` && egrep -i "foo" {} > ${filen}_foo.log' 
+0

這也可以!如果我使用它,唯一會改變的是將備份保存爲.csv格式。謝謝! – user1792398 2013-04-05 15:20:29

+0

它似乎比我選擇的原始解決方案更適合正則表達式,因此我將我接受的答案轉換爲您的答案。再次感謝! – user1792398 2013-04-05 15:25:59

1

你可以試試這個:

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

它使用:

  • find遍歷文件
  • grep打印file path:line元組(-H開關)
  • perl呼應那些線到輸出文件(使用反斜槓,但它可以做得更漂亮)。
+0

我不得不編輯這一點,以使它與問題相匹配,但最終確實奏效。感謝您的迴應。工作代碼是(注意備份的.csv擴展名,並解析「* .csv」文件): 查找。 -type f -name「* .csv」-exec grep -H foo'{}'\; | perl -ne''echo $ 2 >> $ 1_foo.csv' if /(.*):(.*)/' – user1792398 2013-04-05 15:18:53

1

你還可以嘗試:

find -type f -name "*.csv" -a ! -name "*_foo.csv" | while read f; do 
    grep foo "$f" > "${f%.csv}_foo.csv" 
done 
+0

這很好用,謝謝!我喜歡你忽略已經存在的任何備份,如果它運行多次,這是非常棒的。 – user1792398 2013-04-05 15:18:24

相關問題