Ну, я предполагаю, что это должен быть ответ затем.
Это походит на задание для bittorrent.
Для получения полей, Вам нужно с awk
:
awk -F, '{for (i=1 ;i<NF;i++)if(i<10 || i>NF-56) printf "%s" , $i","}
{print $NF}
' your_file > new_file
Использование Perl:
$ perl -F, -wane 'print "$F[0],$F[-1]"' your_file > new_file
Также Вы могли использовать sed
так как Вы не заботитесь ни о чем в середине, это - по существу все промежуточное 2 внешних запятые, можно сделать это:
$ sed 's/,.*,/,/g' your_file > new_file
Первые 9 полей и последние 57 полей
perl -F, -ane 'BEGIN {$,=","} print @F[0..9], @F[-57..-1]' file > newfile
awk
или perl
будет работать быстрее на ~15GB файле.
– user1608941
08.02.2014, 02:53
Не мог сопротивляться: вот сценарий Python (2.7), который читает из входа и записывает измененные строки обратно к выводу:
try:
while True:
line = raw_input()
parts = line.split(',')
newLine = ','.join(parts[:9]) + ',' + ','.join(parts[-57:])
print newLine
except EOFError:
pass
Можно или сохранить это в файл как csvmod.py
и выполненный cat input.csv | python csvmod.py > output.csv
, или если Вы ищете что-то немного менее читаемое, можно использовать следующую строку:
cat input.csv | python -c "exec(\"try:\n while True:\n line = raw_input()\n parts = line.split(',')\n newLine = ','.join(parts[:9]) + ',' + ','.join(parts[-57:])\n print newLine\nexcept EOFError:\n pass\n\")" > output.csv
Я думаю для решения Python 3, которое необходимо было бы просто заменить raw_input
с input
.
awk -F, '{for (i=1 ;i<NF;i++)if(i<10 || i>(NF-57)) printf "%s" , $i","}{print $NF}' my_file > new_file
– user1608941 08.02.2014, 02:40awk
код илиperl
альтернатива, предложенная в другом ответе для выполнения быстрее? – user1608941 08.02.2014, 11:11