Como usar xargs e sed para canalizar os resultados para uma matriz?

2

Eu estou puxando JSON de um endpoint REST usando curl e, em seguida, analisando-o usando o pacote de nó json para obter algumas das Atributos JSON, que eu uso mais tarde em algumas configurações de aplicativos.

curl -s http://52.71.126.196/arcgis/rest/services/WaterNetwork/MapServer/0?f=pjson | json -a fields | json -a name

.. o que dá:

OBJECTID
SHAPE
FACILITYID
ACCOUNTID
METSERVICE
SERVICETYPE
INSTALLDATE
LOCDESC
ROTATION
LOCATIONID
CRITICAL
ENABLED
ACTIVEFLAG
OWNEDBY
MAINTBY
LASTUPDATE
LASTEDITOR
BILLINGNAME
SERVICECODE
CYCLECODE
RATETABLE
SERVICESIZE
REMSERIALNUMBER
METERMULTIPLIER
LONGITUDE
LATITUDE
METERPULL

Perfeito. Mas o que eu realmente preciso é que eles sejam colocados em uma matriz, como:

["OBJECTID", "SHAPE", "FACILITYID", "ACCOUNTID", "METSERVICE", 
 "SERVICETYPE", "INSTALLDATE", "LOCDESC", "ROTATION", "LOCATIONID", 
 "CRITICAL", "ENABLED", "ACTIVEFLAG", "OWNEDBY", "MAINTBY", "LASTUPDATE", 
 "LASTEDITOR", "BILLINGNAME", "SERVICECODE", "CYCLECODE", "RATETABLE",
 "SERVICESIZE", "REMSERIALNUMBER", "METERMULTIPLIER", "LONGITUDE", 
 "LATITUDE", "METERPULL"]

Eu encontrei um comando usando xargs e sed e o hackeei parcialmente para me levar até lá:

curl -s http://52.71.126.196/arcgis/rest/services/WaterNetwork/MapServer/0?f=pjson | json -a fields | json -a name | xargs echo | sed 's/ /", "/g'

... o que dá:

OBJECTID", "SHAPE", "FACILITYID", "ACCOUNTID", "METSERVICE", "SERVICETYPE", 
"INSTALLDATE", "LOCDESC", "ROTATION", "LOCATIONID", "CRITICAL", "ENABLED", 
"ACTIVEFLAG", "OWNEDBY", "MAINTBY", "LASTUPDATE", "LASTEDITOR", 
"BILLINGNAME", "SERVICECODE", "CYCLECODE", "RATETABLE", "SERVICESIZE", 
"REMSERIALNUMBER", "METERMULTIPLIER", "LONGITUDE", "LATITUDE", "METERPULL

Além disso, eu realmente preciso conseguir os dados de alias também:

curl -s http://52.71.126.196/arcgis/rest/services/WaterNetwork/MapServer/0?f=pjson | json -a fields | json -a alias

OBJECTID
SHAPE
Facility Identifier
Account Number
Metered Service
Service Type
Install Date
Location Description
Rotation
Location Identifier
CriticalCustomer
Enabled
Active Flag
Owned By
Managed By
Last Update Date
Last Editor
BILLINGNAME
SERVICECODE
CYCLECODE
RATETABLE
SERVICESIZE
REMSERIALNUMBER
METERMULTIPLIER
LONGITUDE
LATITUDE
METERPULL

Meu comando xargs / sed é dividido aqui, pois há espaços nos aliases:

curl -s http://52.71.126.196/arcgis/rest/services/WaterNetwork/MapServer/0?f=pjson | json -a fields | json -a alias | xargs echo | sed 's/ /", "/g'

Como você pode ver, ele separa cada palavra por espaços, não o que eu preciso.

OBJECTID", "SHAPE", "Facility", "Identifier", "Account", "Number", 
"Metered", "Service", "Service", "Type", "Install", "Date", "Location", 
"Description", "Rotation", "Location", "Identifier", "CriticalCustomer", 
"Enabled", "Active", "Flag", "Owned", "By", "Managed", "By", "Last", 
"Update", "Date", "Last", "Editor", "BILLINGNAME", "SERVICECODE", 
"CYCLECODE", "RATETABLE", "SERVICESIZE", "REMSERIALNUMBER", 
"METERMULTIPLIER", "LONGITUDE", "LATITUDE", "METERPULL

... e aqui é onde o meu xargs / sed foo me falha. Eu não tenho certeza se isso é uma coisa xargs ou sed, e se eu preciso passar um regex para sed para lidar com os espaços possíveis nos aliases. Existe um comando xargs / sed que poderia me dar os resultados para nomes e aliases no formulário de matriz acima?

    
por Chad Cooper 09.03.2016 / 01:53

3 respostas

1

Se você tem python, uma solução simples é:

curl -s http://52.71.126.196/arcgis/rest/services/WaterNetwork/MapServer/0?f=pjson | json -a fields | json -a alias | python -c 'import sys;print([line.strip() for line in sys.stdin])'

que dá:

['OBJECTID', 'SHAPE', 'Facility Identifier', 'Account Number', 'Metered Service', 'Service Type', 'Install Date', 'Location Description', 'Rotation', 'Location Identifier', 'CriticalCustomer', 'Enabled', 'Active Flag', 'Owned By', 'Managed By', 'Last Update Date', 'Last Editor', 'BILLINGNAME', 'SERVICECODE', 'CYCLECODE', 'RATETABLE', 'SERVICESIZE', 'REMSERIALNUMBER', 'METERMULTIPLIER', 'LONGITUDE', 'LATITUDE', 'METERPULL']

Se você precisar de aspas duplas:

curl -s http://52.71.126.196/arcgis/rest/services/WaterNetwork/MapServer/0?f=pjson | json -a fields | json -a alias | python -c 'import sys;print([line.strip() for line in sys.stdin])' | sed 's/'"'"'/"/g'

que dá:

["OBJECTID", "SHAPE", "Facility Identifier", "Account Number", "Metered Service", "Service Type", "Install Date", "Location Description", "Rotation", "Location Identifier", "CriticalCustomer", "Enabled", "Active Flag", "Owned By", "Managed By", "Last Update Date", "Last Editor", "BILLINGNAME", "SERVICECODE", "CYCLECODE", "RATETABLE", "SERVICESIZE", "REMSERIALNUMBER", "METERMULTIPLIER", "LONGITUDE", "LATITUDE", "METERPULL"]
    
por 09.03.2016 / 03:25
2
$ curl -s http://52.71.126.196/arcgis/rest/services/WaterNetwork/MapServer/0?f=pjson | json -a fields | json -a alias | sed 's/\(.*\)/[""]/g' | json -g

[""] é o grupo de captura regex, agrupado entre aspas e colchetes - para obter uma lista de matrizes, cada uma contendo um único elemento alias , desta forma:

["foo bar"] ["baz quux"]

Em seguida, o json -g agrupará todos os mini-arrays em um único:

["foo bar", "baz quux"]

    
por 09.03.2016 / 03:25
0

Tente usar perl :

curl -s http://52.71.126.196/arcgis/rest/services/WaterNetwork/MapServer/0?f=pjson | json -a fields | json -a alias | perl -pe 's/\n/", "/g'

Dá:

OBJECTID", "SHAPE", "Facility Identifier", "Account Number", "Metered Service", "Service Type", "Install Date", "Location Description", "Rotation", "Location Identifier", "CriticalCustomer", "Enabled", "Active Flag", "Owned By", "Managed By", "Last Update Date", "Last Editor", "BILLINGNAME", "SERVICECODE", "CYCLECODE", "RATETABLE", "SERVICESIZE", "REMSERIALNUMBER", "METERMULTIPLIER", "LONGITUDE", "LATITUDE", "METERPULL
    
por 09.03.2016 / 03:10