Я работаю sudo
непосредственно из сценария:
if [ $EUID != 0 ]; then
sudo "$0" "$@"
exit $?
fi
ruby -rcsv -e 'puts CSV.parse(STDIN).transpose.map &:to_csv' < in.csv > out.csv
Парсинг CSV легко не сделан с инструментами POSIX только, если Вы не используете упрощенный вариант CSV без заключения в кавычки (так, чтобы запятые не могли появиться в поле). Даже затем эта задача не кажется легкой сделать с awk или другой обработкой текста к инструменту. Можно использовать Perl с Text::CSV
, Python с csv
, R с read.csv
, Ruby с CSV, … (Все они являются частью стандартной библиотеки соответствующего языка за исключением Perl.)
Например, в Python:
import csv, sys
rows = list(csv.reader(sys.stdin))
writer = csv.writer(sys.stdout)
for col in xrange(0, len(rows[0])):
writer.writerow([row[col] for row in rows])
Быстрое и грязное решение для удара:
c=1
file=file.txt
num_lines=$(wc -l < "$file")
for ((i=0; i<num_lines; i++)) {
cut -d, -f$c "$file" | paste -sd ','
((c++))
}
for ((i=1; i<=$num_cols; ++i)); do paste -s -d, <(cut -f$i -d, file.txt); done
– iruvar
08.01.2013, 15:29
this "is" example
ячейка кодируется "this ""is"" example"
Я не убежден, обрабатывает ли это решение такие случаи правильно
– Grzegorz Wierzowiecki
05.10.2016, 15:44
Учитывая предлагаемое ограничение (без кавычек, без встроенных запятых), это просто в awk (как это было бы в perl без учета более тысячи строк в CSV.pm
, 2300 строк в csv.rb
- python имеет только 450 строк в csv.py
).
Вот пример для awk:
#!/usr/bin/awk -f
BEGIN { width=0; }
{
max = split($0, list, ",");
# printf "%d:%s\n", NR, $0;
if (width < max)
width = max;
for (n = 1; n <= max; ++n) {
sub("^[ ]*","",list[n]);
sub("[ ]*$","",list[n]);
# printf "\t%d:%s\n", n, list[n];
if ( columns[n] != "" ) {
columns[n] = columns[n] ", ";
}
columns[n] = columns[n] list[n];
}
}
END {
# printf "%d columns\n", width;
for (n = 1; n <= width; ++n) {
printf "%s\n", columns[n];
}
}
Между прочим: в данном примере было лишнее пространство, которое OP предположил, что он будет удален; в других примерах эта деталь не рассматривалась.
Из https://stackoverflow.com/a/2776078 :
$ apt-get install csvtool
А затем преобразовать
$ csvtool transpose input.csv > ouput.csv
Или в конвейере
$ ... | csvtool transpose - | ...