2015-05-29 4 views
0

У меня есть большой файл csv, который мне нужно свести до последних 1000 строк через работу cron каждый день.linux cron truncate большой файл

Может ли кто-нибудь предложить, как это сделать?

То, что я до сих пор две команды, но не знаю, как объединить их

Для удаления строки из самого начала файла команда

ed -s file.csv <<< $'1,123d\nwq'

где 123 это число строк, необходимых для удаления с начала файла

Для считывания количества строк в файле команда

wc -l file.csv 

Мне нужно было вычесть 1000 из этого и передать результат первой команде Есть ли способ объединить результат команды wc в команде ed?

Спасибо заранее

+0

Возможный дубликат [Как удалить все, кроме последних 10 строк из файла?] (Http://stackoverflow.com/questions/3775383/how-can-i-remove-all-but-the-last -10-lines-from-a-file) –

+3

Использование: 'tail -n -1000 file> newfile; mv newfile file' – user3439894

+0

Укрытие это работает, но было бы удобнее, если бы я мог редактировать файл, а не создавать новый файл. – manolish

ответ

1

Предполагая, что Баш является оболочка, «файл» является файлом (и существует):

sed -i "1,$(($(wc -l < file) - 1000))d" file 

Edit: краткая версия не будет работать, чисто для файлов с 1000 или меньше строк. Более надежный скрипт, обработки всех .csv файлов в определенном каталоге:

#!/bin/env bash 

DIR=/path/to/csv/files 
N=1000 

for csv in $DIR/*.csv; do 
    L=$(wc -l < $csv) 
    [ $L -le $N ] && continue 
    sed -i "1,$(($L - $N))d" $csv 
done 

Следующая редактировать: обрабатывать каталог без каких-либо файлов .csv?

+0

То, что мне нужно. Благодарю. – manolish

+0

Можно ли зацикливать все файлы .csv? – manolish

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