2013-09-27 16 views
1

我有一個tar文件,裏面有很多csv文件。 如何獲取每個csv文件的前幾行而不提取它?如何從tar文件中的csv文件中提取前幾行而不在linux中解壓縮?

我想:

$(tar -Oxf $tarfile $file | head -n "$NL") >> cdn.log 

,但得到錯誤說:

time(http:index: command not found 

這是CSV文件中的一個部分行。所有csv文件都會報告類似的錯誤... 任何想法?

+2

這是正確的,你正在嘗試評估幾個第一行文件。刪除$()。 – keltar

+1

要詳細說明@keltar所說的話,說'tar -Oxf $ tarfile $ file |頭-n「$ NL」>> cdn.log' – devnull

+0

很好....它的工作.....非常感謝@keltar – user1407668

回答

2

使用-O您可以告訴tar將文件提取到標準輸出而不是文件。因此,您應該能夠首先使用tar tf <YOUR_FILE>列出存檔中的文件,並使用grep過濾它以查找CSV文件,然後爲每個文件使用tar xf <YOUR_FILE> <NAME_OF_CSV> -O | head以使文件開始到stdout。這可能有點無效,因爲您將存檔與CSV文件一樣多地解壓縮,但應該可以工作。

+0

我試過這個。 在$文件(焦油-tf 「$ tar文件」) 做 cdn.log = $(焦油-Oxf $ tar文件$文件|頭-n 「$ NL」) 做 其中NL是行數...但沒有工作 – user1407668

+0

我試過 $(tar -Oxf $ tarfile $ file | head -n「$ NL」)>> cdn.log 但是有錯誤說... time(http:index:command not發現 「時間(http:索引:」這是一些行在csv文件.... 任何想法?? – user1407668

+0

它只是不能像你說的那樣,請張貼你的完整腳本。這只是輕微的不同 - 我有一種感覺,你做了一件完全錯誤的事情。 – keltar

0

您可以使用及其Archive::Tar模塊。這裏一個班輪是提取每一個的前兩行:

perl -MArchive::Tar -E ' 
    for (Archive::Tar->new(shift)->get_files) { 
     say (join qq|\n|, (split /\n/, $_->get_content, 3)[0..1]) 
    } 
' file.tar 

它假定tar文件只有文本文件,而且它們csv。否則,你將不得不grep列表來過濾你想要的。

相關問題