Что мы можем сделать, так это переместить столбцы в строки с помощью утилиты rs
из BSD Unix, а затем просто sort
строки (таким образом, эффективно сортируя столбцы исходных данных), а затем снова транспонировать.
Во-первых, обратите внимание, что в алфавитном порядке это: адрес, номер мобильного телефона, имя. M стоит перед N!
Шаг за шагом:
$ cat data
name ,adress ,mobile-number
Ane ,USA ,12121212
Joane ,England ,234234
$ rs -s, -C, -T < data
name ,Ane ,Joane ,
adress ,USA ,England ,
mobile-number,12121212,234234,
$ rs -s, -C, -T < data | sort
adress ,USA ,England ,
mobile-number,12121212,234234,
name ,Ane ,Joane ,
$ rs -s, -C, -T < data | sort | rs -s, -C, -T
adress ,mobile-number,name ,
USA ,12121212,Ane ,
England ,234234,Joane ,
$ rs -s, -C, -T < data | sort | rs -s, -S' ' -T
adress mobile-number name
USA 12121212 Ane
England 234234 Joane
Наконец:
$ rs -s, -C, -T < data | sort | rs -s, -S' ' -T | sed -e 's/ \([^ ]\)/,\1/g'
adress ,mobile-number ,name
USA ,12121212 ,Ane
England ,234234 ,Joane
Я сделал это в Ubuntu GNU / Linux, и сначала мне пришлось sudo apt-get install rs
.
Хорошо.
Вдохновленный ответом @drewbenn, я сам написал его на Python, используя библиотеку Requests ( http://requests.readthedocs.io/en/master/ ):
import requests
import sys
url = sys.argv[1]
print "Connecting ", url
r = requests.get(url)
print r.text
flag = True
while flag :
s = raw_input()
data = {"opt": s}
r = requests.get(url, params=data)
print r.text
Вы можете использовать telnet для подключения к серверу. , зная, что (
здесь я предполагаю, что вы хотите использовать веб-сервер для связи) вам нужно будет действовать в рамках ограничений спецификации HTTP.
Например, спецификация https://www.w3.org/Protocols/rfc2616/rfc2616.txt
гласит:
Исходные серверы ДОЛЖНЫ включать поле заголовка даты во всех ответы, за исключением этих случаев: ...
вот конечный результат "разговора", который у меня был с веб-сервером по telnet.
Принимая во внимание, что конфигурация веб-серверов будет определять, как долго TCP-соединение будет оставаться активным, т. Е. Время, которое вам нужно ввести правильно сформированный HTTP-запрос, прежде чем сервер разорвет TCP-соединение из-за " бездействие ". но это можно настроить.
Если вы вводите каждый запрос до тайм-аута, вы, по сути, будете отправлять множество HTTP-запросов и ответов через одно непрерывное TCP-соединение.
% telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1 <---- this in where you type characters "interactively"
Host: localhost <---- this in where you type characters "interactively"
<-- per the HTTP specification this has to be an emtpy line
to tell the server you are done with your "message"
HTTP/1.1 200 OK
Server: nginx/1.10.0 (Ubuntu)
Date: Sat, 17 Sep 2016 07:38:08 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
45d
<html>
[truncated ... ]
</html>
0
GET / HTTP/1.1 <-- now you are back at prompt
Host: localhost Note: you need to enter the `Host` header if you are talking
to a webserver
HTTP/1.1 200 OK
Server: nginx/1.10.0 (Ubuntu)
Date: Sat, 17 Sep 2016 07:41:07 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
45d
<html>
[truncated]
Очевидно, чтобы получить более чистый «диалог», вам нужно очистить вывод веб-сервера или вашего приложения, которое будет обрабатывать запросы.
nginx ttp_core_module
отвечает за управление типом по умолчанию, используя
http://nginx.org/en/docs/http/ngx_http_core_module.html#default_type
Чтобы добавить заголовки, вы можете используйте http_headers_module
http://nginx.org/en/docs/http/ngx_http_headers_module.html
Если вы не против использования curl
в качестве серверной части, и вам просто не нужно каждый раз вводить весь URL-адрес, вы можете запустить curl
в цикле, что-то вроде этого:
read -p "Server name: " s && curl -fs "$s" && while true; do read -p "$ " x && curl -fs "$s?opt=${x^^}" || break; done
, который также хорошо вписался бы в псевдоним
, если бы вы не хотели каждый раз вводить или вставлять все это целиком.
Здесь не так много проверки ошибок, что, вероятно, нормально, если вам просто нужен простой способ поговорить со своим собственным доверенным сервером, а не пытаться взломать собственный сценарий.Более продвинутый сценарий может проверить имя сервера или попытаться проанализировать возвращенные веб-страницы перед их отображением, и, конечно же, обе стороны должны защищаться от ненадежного ввода.
Я добавил два параметра в curl
:
-f
завершится с кодом ошибки 21
, если веб-страница вернет ошибку 400
или выше (полезно для команды quit
) -s
тихий режим не отображает данные подключения для каждой команды. Помимо этого, вы будете точно видеть, что ваш сервер выводит для каждого запроса.
Если это RESTful HTTP API, особенно разновидность HATEOAS, то вы можете использовать Spring rest-shell
https://github.com/spring-projects/rest-shell
Пример использования:
http://localhost:8080:> discover
rel href
========================================================
address http://localhost:8080/address
family http://localhost:8080/family
people http://localhost:8080/person
profile http://localhost:8080/profile
http://localhost:8080:> follow people
http://localhost:8080/person:> list
rel href
===================================================
people.Person http://localhost:8080/person/1
people.Person http://localhost:8080/person/2
people.search http://localhost:8080/person/search
http://localhost:8080/person:> get 1
...