2016-03-02 7 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 

Это делает работу для первого значения $ FILE, но не возвращает приглашение, и, следовательно, я не могу выполнить эту петлю.

Например у меня есть следующие файлы в трех различных папках, 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 каждый из семян1, 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() и nextfile и внутреннего управления файлами. Решения с другими awks менее эффективны, требуют немного больше кодирования и требуют, чтобы вы управляли закрывающими файлами, когда слишком много будет открыто.

+0

Извините, мой вопрос был неясен .. вы можете отредактировать свой ответ, чтобы разместить этот вопрос (я его отредактировал)? – gforce89

+1

Измените свой вопрос, чтобы уточнить, что вы пытаетесь сделать, поскольку мы не можем сказать по сценарию, который НЕ делает то, что вы хотите, чего вы на самом деле хотите (ясно, поскольку мы уже пробовали это и, по-видимому, догадались). Включите краткий, тестируемый ввод проб и ожидаемый результат. –

+0

Я думаю, 'для f в seed1/*; do b = $ {f # seed1 /}; awk -v x = "$ x" -v y = "$ y" 'FNR> = x; FNR == y {nextfile} '"$ f" "seed2/$ b" "seed3/$ b"> "объединенный/$ b"; done' – tripleee

 Смежные вопросы

  • Нет связанных вопросов^_^