Удаление определенных полей из файла CSV

Ну, я предполагаю, что это должен быть ответ затем.

Это походит на задание для bittorrent.

0
08.02.2014, 02:27
4 ответа

Для получения полей, Вам нужно с awk:

awk -F,   '{for (i=1 ;i<NF;i++)if(i<10 || i>NF-56) printf "%s" , $i","}
           {print $NF}
    ' your_file > new_file
1
28.01.2020, 02:52
  • 1
    я, возможно, не был достаточно ясен, я не имел в виду первый и последний, я имел в виду все те перед двумя в середине (1 - 9), и все они после (продержитесь 56 через последний). –  user1608941 08.02.2014, 00:42
  • 2
    @user1608941 обновляется. –  Joseph R. 08.02.2014, 02:19
  • 3
    я предполагаю это, не мог бы работать, потому что, когда существует запятая в 10-м или 11-м поле, я должен удалить также 12-е или возможно еще больше вниз (если существует больше чем одна запятая). Это было бы соответствующим решением? 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:40
  • 4
    @user1608941 Вы правы, я зафиксировал его. Спасибо за указание на это. –  Joseph R. 08.02.2014, 02:45
  • 5
    Спасибо, работает отлично! Вы ожидали бы это awk код или perl альтернатива, предложенная в другом ответе для выполнения быстрее? –  user1608941 08.02.2014, 11:11

Использование Perl:

$ perl -F, -wane 'print "$F[0],$F[-1]"' your_file > new_file 

Также Вы могли использовать sed так как Вы не заботитесь ни о чем в середине, это - по существу все промежуточное 2 внешних запятые, можно сделать это:

$ sed 's/,.*,/,/g' your_file > new_file
0
28.01.2020, 02:52

Первые 9 полей и последние 57 полей

perl -F, -ane 'BEGIN {$,=","} print @F[0..9], @F[-57..-1]' file > newfile
0
28.01.2020, 02:52
  • 1
    Спасибо, это также работает отлично! Я задаюсь вопросом ли 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.

0
28.01.2020, 02:52
  • 1
    @user1608941 С тех пор raw_input (), вероятно, более сложен, чем простое чтение от stdin, аналогичное решение, которое использует sys.stdin.readline () вместо этого, могло быть быстрее (но необходимо будет удалить \n или \r\n от каждой строки сами). Точно так же использование sys.stdout.write вместо печати могло также быть несколько быстрее. Но это просто некоторые мысли, я не выполнил сравнительных тестов об этом. –  brm 10.02.2014, 20:11

Теги

Похожие вопросы