Поменять местами широту и сгруппировать в квадратных скобках

Обычно, когда вы не хотите записывать файл, вы можете заменить его (именованным) каналом, но канал не может быть прочитан двумя процессами одновременно . В вашем случае вы можете использовать tee , чтобы разделить ваш ввод и использовать именованный канал для одного из его концов:

mkfifo p
cmd1 | tee p | cmd2 | diff p -
rm p

Это, однако, имеет один серьезный недостаток: каналы имеют ограниченный буфер (64 КБ в Linux ), поэтому, когда diff будет читать один из них слишком сильно по сравнению с другим, весь конвейер будет заблокирован. Проблему можно обойти, используя команду buffer по крайней мере для одного канала:

mkfifo p
cmd1 | tee p | cmd2 | buffer | diff p -
rm p

См. Также здесь для получения информации о других параметрах буферизации.

Другое решение для взаимоблокировок - использовать переменную для буферизации всего вывода cmd1 в нем (загрузка его в память):

cmd1 | ( b=$(cat); cmd2 <<<"$b" | diff <(echo "$b") - )

1
25.11.2018, 16:59
3 ответа
sed 's/;\([0-9.]*\) \([0-9.]*\)/,[\2,\1]/g' input.csv > output.csv

может выполнять эту работу, но во 2-й строке есть группа 1.306663 103.83587 1.30693 103.83583 , у которой нет разделителя ; . Если это не опечатка, сценарий следует изменить как

sed 's/[; ]\?\([0-9.]\+\) \([0-9.]\+\)/,[\2,\1]/g' input.csv > output.csv

, что даст

1,[103.83589,1.30453],[103.83587,1.306663],[103.5,1.30],[103.83883,1.30693],[103.835793,1.30709],[103.835757,1.30725],[103.83572,1.30741],[103.8798,1.30753]
2,[103.83589,1.353],[103.83587,1.306663],[103.83583,1.30693],[103.835793,1.30709],[103.835757,1.30725],[103.83572,1.30741],[103.835,1.30753]
3,[103.83589,1.30653],[103.83587,1.306663],[103.83585,1.306797];1.3693
2
27.01.2020, 23:14

С GNU sed 4.2. 2, вы можете использовать простой sed скрипт, например, следующий:

sed 's/\([0-9.]\+\) \([0-9.]\+\)/[\2,\1]/g;s/;/,/g' < input.csv > output.csv

В нем нужны обратные слеши для скобок и + в шаблоне совпадения (а также цифры в замене), чтобы sed рассматривал их как метасимволы.

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

Хотя, учитывая двойное использование , в выводе, его может быть нелегко загрузить как CSV.

2
27.01.2020, 23:14
perl -F'\s+|;' -pale '$" = ",";
   $_ = "$F[0],[" . join("],[", map { "@F[2*$_,2*$_-1]" } 1 .. @F/2) . "]";
' yourfile

Brief

The field separator are set at multiple whitespaces or semicolon. Then
excepting for the 1st field, the rest come in pairs. So keeping aside
($F[0]) we look at 2 fields at a time, flip them, & join all these pairs
with "],[".
2
27.01.2020, 23:14

Теги

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