rs
rs
поставляется с BSD и macOS, но его можно получить в менеджерах пакетов на других платформах. Он назван в честь функции изменения формы в APL.
Используйте последовательности пробелов и табуляции в качестве разделителя столбцов:
rs -T
Использовать табуляцию как разделитель столбцов:
rs -c -C -T
Используйте запятую в качестве разделителя столбцов:
rs -c, -C, -T
-c
изменяет разделитель входного столбца, а -C
изменяет разделитель выходного столбца. Только -c
или -C
устанавливает разделитель табуляции. -T
меняет местами строки и столбцы.
Не используйте -t
вместо -T
, потому что он использует автоматически выбранное количество выходных столбцов, которое обычно не будет правильным, потому что оно выбрано так, чтобы выходные строки заполняли ширину дисплея (которая по умолчанию составляет 80 символов, но которая можно изменить с помощью -w
).
Когда разделитель выходных столбцов указан с помощью -C
, в конец каждой строки добавляется дополнительный символ разделителя столбцов, но вы можете удалить его следующим образом:
$ seq 4|paste -d, - -|rs -c, -C, -T
1,3,
2,4,
$ seq 4|paste -d, - -|rs -c, -C, -T|sed 's/.$//'
1,3
2,4
Это не удается для таблиц, в которых первая строка заканчивается одним или несколькими пустыми столбцами, потому что количество столбцов определяется на основе количества столбцов в первой строке:
$ rs -C, -c, -T<<<$'1,\n3,4'
1,3,4,
таращиться
$ seq 4|paste -d, - -|awk '{for(i=1;i<=NF;i++)a[i][NR]=$i}END{for(i in a)for(j in a[i])printf"%s"(j==NR?"\n":FS),a[i][j]}' FS=,
1,3
2,4
При этом используются массивы массивов, что является особенностью gawk
. macOS поставляется с версией nawk
от 2007 года, которая не поддерживает массивы массивов.
Чтобы использовать пробел в качестве разделителя без сворачивания последовательностей символов пробела и табуляции, используйте FS='[ ]'
.
Рубин
$ seq 4|paste -d, - -|ruby -e'STDIN.map{|x|x.chomp.split(",",-1)}.transpose.each{|x|puts x*","}'
1,3
2,4
Аргумент -1
для split
запрещает отбрасывание пустых полей в конце:
$ ruby -e'p"a,,".split(",")'
["a"]
$ ruby -e'p"a,,".split(",",-1)'
["a", "", ""]
Функциональная форма:
$ tp(){ ruby -e's=ARGV[0];STDIN.map{|x|x.chomp.split(s==" "?/ /:s,-1)}.transpose.each{|x|puts x*s}' -- "${1-$'\t'}";}
$ seq 4|paste -d, - -|tp ,
1,3
2,4
s==" "?/ /:s
используется выше, потому что, когда аргумент функции split
является одним пробелом, он включает специальное поведение, подобное awk, при котором строки разделяются на основе непрерывных пробелов и табуляций:
$ ruby -e'p" a \tb ".split(/ /,-1)'
["", "a", "", "\tb", ""]
$ ruby -e'p" a \tb ".split(" ",-1)'
["a", "b", ""]
jq
tp(){ jq -R .|jq --arg x "${1-$'\t'}" -sr 'map(./$x)|transpose|map(join($x))[]';}
jq -R .
печатает каждую строку ввода как строковый литерал JSON, -s
(--slurp
) создает массив для строк ввода после анализа каждой строки как JSON, а -r
(--raw-output
) выводит содержимое строк вместо строковых литералов JSON. Оператор /
перегружен для разделения строк.
person
nisetama
schedule
11.05.2015