самый быстрый путь преобразовывает файл с разделением табуляцией в csv в Linux

У меня есть файл с разделением табуляцией, который имеет более чем 200 миллионов строк. Каков самый быстрый путь в Linux для преобразования этого в файл CSV? Этот файл действительно имеет несколько строк информации заголовка, которую я должен буду разделить в будущем, но количество строк заголовка известно. Я видел предложения для sed и gawk, но интересно, существует ли "предпочтительный" выбор.

Просто для уточнения в этом файле нет никаких встроенных вкладок.

46
задан andrewj 28 March 2010 в 14:37
поделиться

5 ответов

Если все, что вам нужно сделать, это преобразовать все символы табуляции в символы запятой, tr , вероятно, подходит идти.

Пустое место здесь - это буквальная табуляция:

$ echo "hello   world" | tr "\\t" ","
hello,world

Конечно, если у вас есть встроенные табуляции внутри строковых литералов в файле, это также неправильно переведет их; но встроенные буквенные вкладки встречаются довольно редко.

50
ответ дан 7 November 2019 в 13:41
поделиться
perl -lpe 's/"/""/g; s/^|$/"/g; s/\t/","/g' < input.tab > output.csv

Perl обычно быстрее справляется с подобными задачами, чем sed, awk и Python.

20
ответ дан 7 November 2019 в 13:41
поделиться

при условии, что вы не хотите изменять заголовок, и при условии, что у вас нет встроенных вкладок

# cat file
header  header  header
one     two     three

$ awk 'NR>1{$1=$1}1' OFS="," file
header  header  header
one,two,three

NR> 1 пропускает первый заголовок. вы упомянули, что знаете, сколько строк в заголовке, поэтому используйте правильный номер в своем случае. при этом вам также не нужно вызывать какие-либо другие внешние команды. всего одна команда awk выполняет свою работу.

другой способ, если у вас есть пустые столбцы, и вам это небезразлично.

awk 'NR>1{gsub("\t",",")}1' file

с использованием sed

sed '2,$y/\t/,/' file #skip 1 line header and translate (same as tr)
3
ответ дан 7 November 2019 в 13:41
поделиться
sed -e 's/"/\\"/g' -e 's/<tab>/","/g' -e 's/^/"/' -e 's/$/"/' infile > outfile

Будь прокляты критики, цитируйте все подряд, CSV это не волнует.

- это настоящий символ табуляции. \t у меня не сработало. В bash используйте ^V, чтобы ввести его.

6
ответ дан 7 November 2019 в 13:41
поделиться

Если вас беспокоят встроенные запятые, вам нужно использовать более интеллектуальный метод. Вот сценарий Python, который берет строки TSV из стандартного ввода и записывает строки CSV в стандартный вывод:

import sys
import csv

tabin = csv.reader(sys.stdin, dialect=csv.excel_tab)
commaout = csv.writer(sys.stdout, dialect=csv.excel)
for row in tabin:
  commaout.writerow(row)

Запустите его из оболочки следующим образом:

python script.py < input.tsv > output.csv
73
ответ дан 7 November 2019 в 13:41
поделиться
Другие вопросы по тегам:

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