У меня есть файл с разделением табуляцией, который имеет более чем 200 миллионов строк. Каков самый быстрый путь в Linux для преобразования этого в файл CSV? Этот файл действительно имеет несколько строк информации заголовка, которую я должен буду разделить в будущем, но количество строк заголовка известно. Я видел предложения для sed
и gawk
, но интересно, существует ли "предпочтительный" выбор.
Просто для уточнения в этом файле нет никаких встроенных вкладок.
Если все, что вам нужно сделать, это преобразовать все символы табуляции в символы запятой, tr
, вероятно, подходит идти.
Пустое место здесь - это буквальная табуляция:
$ echo "hello world" | tr "\\t" ","
hello,world
Конечно, если у вас есть встроенные табуляции внутри строковых литералов в файле, это также неправильно переведет их; но встроенные буквенные вкладки встречаются довольно редко.
perl -lpe 's/"/""/g; s/^|$/"/g; s/\t/","/g' < input.tab > output.csv
Perl обычно быстрее справляется с подобными задачами, чем sed, awk и Python.
при условии, что вы не хотите изменять заголовок, и при условии, что у вас нет встроенных вкладок
# 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)
sed -e 's/"/\\"/g' -e 's/<tab>/","/g' -e 's/^/"/' -e 's/$/"/' infile > outfile
Будь прокляты критики, цитируйте все подряд, CSV это не волнует.
- это настоящий символ табуляции. \t у меня не сработало. В bash используйте ^V, чтобы ввести его.
Если вас беспокоят встроенные запятые, вам нужно использовать более интеллектуальный метод. Вот сценарий 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