Поскольку ваш вопрос значительно изменился с течением времени, я попытаюсь рассмотреть три отдельных момента.
Ваша команда awk
пытается разбить ваши строки на вхождения admin:
. Даже если бы это имело смысл, вы могли бы ссылаться только на поля $1
и $2
, поскольку у вас есть только одно вхождение admin:
в каждой из ваших строк.
Возможно, вы ищете что-то вроде:
printf '%s\n' '"_id":"asc","name":"enygren","admin":[],"creat":"date3"' |
sed 's/"//g' |
awk -F',' -v OFS='|' '{if ($2~/name:/){print $1,$3,$4,$2} else {$1=$1; print $0}}'
Что, конечно, может оказаться не очень хорошей идеей.:/name:/
соответствует всему, что содержит name:
, а не только точную метку name:
.
В любом случае, это похоже на задачу XY .
Вот awk
решение, которое можно настроить для выбора и изменения порядка столбцов, предполагая, что они взяты из текстового файла с разделителями .
Предполагается, что поля ваших входных данных не могут содержать никаких "
или ,
. Это звучит разумно, основываясь на коде, который вы разместили 1 , но на самом деле это не так. Вам следует прибегнуть к некоторому инструменту, специализирующемуся на манипулировании структурированными данными (, см. ниже ), например. csvkit для CSV или jq для JSON (спасибо Kiwi за подсказку ).
Учитывая сценарийprog_file
:
BEGIN {
# Create an array of labels for the fileds you want
# to keep, in the order you want to print them
labels[1] = "\"_id\""
labels[2] = "\"admin\""
labels[3] = "\"creat\""
labels[4] = "\"name\""
}
{
# Split any field on ":" and make an array of
# full fields indexed by their label.
# This assumes labels DO NOT CONTAIN any ":"
for ( i=1; i<=NF; i++ ) {
split($i, chunks, ":")
fields[chunks[1]] = $i
}
# Reset the record
$0 = ""
# Re-build the record with only the fields
# whose labels are in the array we defined in
# the BEGIN block.
# Explicitly use "4" as the upper bound because
# POSIX does not specify the order in which
# "for (var in array)" assigns indexes to var
for ( i=1; i<=4; i++ ) {
$i = fields[labels[i]]
}
# Strip any double quote
gsub("\"","")
print $0
}
и вход 2:
"_id":"123","admin":[src],"creat":"date1","name":"dedu"
"_id":"2w3","admin":[analise],"creat":"date2","name":"csv"
"_id":"asc","name":"enygren","admin":[],"creat":"date3"
"_id":"scd","admin":[],"creat":"date4","name":"tzpi"
призыв:
awk -v FS=',' -v OFS='|' -f prog_file input_file
дает 3:
_id:123|admin:[src]|creat:date1|name:dedu
_id:2w3|admin:[analise]|creat:date2|name:csv
_id:asc|admin:[]|creat:date3|name:enygren
_id:scd|admin:[]|creat:date4|name:tzpi
Последняя выборка входных данных, которую вы отредактировали в своем вопросе, похоже, не из текстового файла с разделителями. Это похоже на список объектов JSON.
Несмотря на то, что он -удобочитаем для человека, JSON представляет собой формат данных и требует другого подхода — действительно, приведенное выше awk
решение не будет работать с такими входными данными.
Добавив битовую структуру, ваш семпл можно повернуть (назад?)в действительный JSON:
$ cat file
"a":"val1","c":"val2","b":"val3","d":"val4"
"a":"val1","b":[],"c":"val3","d":"val4"
"a":"val1","d":["val2","val32"],"c":"val3","b":"val4"
"d":"val1","a":"val2","c":"val3","b":"val4"
(Обратите внимание, что я предположил, что отсутствующий "
в "d":["val2","val32]
был опечаткой, и использовал "d":["val2","val32"]
вместо ).
$ sed 's/^/{/; s/$/},/; 1 s/^/[/; $ s/,$/]/' file >tmpfile
$ cat tmpfile
[{"a":"val1","c":"val2","b":"val3","d":"val4"},
{"a":"val1","b":[],"c":"val3","d":"val4"},
{"a":"val1","d":["val2","val32"],"c":"val3","b":"val4"},
{"d":"val1","a":"val2","c":"val3","b":"val4"}]
Тогда безопасным подходом будет использование процессора JSON в качестве jq
для фильтрации и изменения порядка ваших данных:
$ jq -r '.[] | {a:.a, b:.b, c:.c, d:.d} | @text' tmpfile
{"a":"val1","b":"val3","c":"val2","d":"val4"}
{"a":"val1","b":[],"c":"val3","d":"val4"}
{"a":"val1","b":"val4","c":"val3","d":["val2","val32"]}
{"a":"val2","b":"val4","c":"val3","d":"val1"}
Удаление оставшихся открывающих и закрывающих фигурных скобок тривиально и безопасно, в то время как будет небезопасно слепо удалять двойные кавычки("
)или заменять запятые вертикальными чертами(,
→|
)для полностью соответствует выходному образцу.
1Из вопросов исправлений № 4 по № 7 .
2Вывод из последней части вопроса редакция № 6 .
3Из вопроса редакция № 6 .
Допустим, у вас есть сервер с SSH и MySQL.
ssh -L 3336:127.0.0.1:3306 root@rpi_addr
Затем вызов MySQL на вашем локальном хосте будет туннелирован в rpi _адресный интерфейс localhost... Подробнее здесь:https://linuxize.com/post/how-to-setup-ssh-tunneling/
Если я правильно понял ваш вопрос, вы хотите, чтобы удаленный хост мог использовать канал SSH для доступа к серверу SOCKS, а не наоборот. Я думаю, что вам нужно использовать опцию -R для такого рода вещей, а не -D.