2016-03-02 42 views
0

我有很多巨大的文件,說3個不同的文件夾,我想從中複製說從X到Y的同名文件的行,並將它們追加到一個新的同名文件。 我試着做從X到Y多個文件的貓行到一個文件

ls seed1/* | while read FILE; do 
head -n $Y | tail -n $X seed1/$FILE seed2/$FILE seed3/$FILE > combined/$FILE 
done 

這確實爲$文件的第一個值的工作,但這並不返回提示,因此我無法執行這個循環。

例如我有在三個不同的文件夾以下的文件,SEED1,seed2中和seed3:

seed1/foo.dat 
seed1/bar.dat 
seed1/qax.dat 

seed2/foo.dat 
seed2/bar.dat 
seed2/qax.dat 

seed3/foo.dat 
seed3/bar.dat 
seed3/qax.dat 

我想在對線10相結合,所有文件的20到組合文件夾:

combined/foo.dat 
combined/bar.dat 
combined/qax.dat 

組合中的每個文件都有30行,每個文件中有10行來自seed1,seed2和seed3。

+0

由於沒有給出'head'文件參數,提示消失。使用ls生成FILE,然後覆蓋FILE看起來也很腥。 – peak

回答

2

無環要求:

awk -v x=10 -v y=20 ' 
    FNR==1 { out = gensub(/.*\//,"combined/",1,FILENAME) } 
    FNR>=x { print > out } 
    FNR==y { nextfile } 
' seed*/*.dat 

以上數據假設「組合拳」目錄已經存在(空或不)AWK是調用之前使用了GNU AWK的gensub()和下一文件和內部文件管理。使用其他awk的解決方案效率較低,需要多一點編碼,並且需要您在打開多個文件時管理關閉文件。

+0

對不起,我的問題不清楚..你能編輯你的答案以適應這個問題嗎(我已經編輯過了)? – gforce89

+1

編輯你的問題,澄清你想要做什麼,因爲我們不能從腳本中知道你不需要什麼,你真正想要的是什麼(顯然,因爲我們已經嘗試過,顯然是錯誤的)。包括簡潔,可測試的樣本輸入和預期輸出。 –

+0

我猜'對於seed1/*中的f;做b = $ {f#seed1 /}; awk -v x =「$ x」-v y =「$ y」'FNR> = x; FNR == y {nextfile}'「$ f」「seed2/$ b」「seed3/$ b」>「combined/$ b」;完成' – tripleee

相關問題