2017-01-15 3 views
1

У меня есть файл, который имеет следующие данные. Я просто хочу цифры ownerId и значения profileID, разделенные :.using sed Я хочу напечатать только некоторую строку в строках

Мой файл:

ObjectId("57a046a06f858a9c73b3468a"), "ownerId" : "923003345778", "profileId" : "FreeBundles,LBCNorthParentOffer", "instanceId" : null, "queuedFor" : "unassigned", "state" : "active", "createDateTime" : 1470121632, "startDateTime" : 1470121632, "expireDateTime" : 1485673632, "removeDateTime" : 1487747232, "extensionDateTime" : null, "cancelled" : false, "mode" : "onceOff", "nextMode" : "none", "profileData" : { "serviceProfileId" : "ecs19", "counter" : 1 } } 
ObjectId("57a046a06f858a9c73b34688"), "cancelled" : false, "createDateTime" : 1470121632, "expireDateTime" : 1557514799, "extensionDateTime" : null, "instanceId" : null, "mode" : "onceOff", "nextMode" : "none", "ownerId" : "923003345778", "profileData" : { "serviceProfileId" : "ecs19", "counter" : 1 }, "profileId" : "Prov3G,HLRProv", "queuedFor" : "unassigned", "removeDateTime" : 1557514799, "startDateTime" : 1470121632, "state" : "active" } 
ObjectId("56d48bd38a8b93baa708fcfa"), "ownerId" : "923003309452", "profileId" : "DiscountOnUsage,Segment04", "instanceId" : null, "queuedFor" : "unassigned", "state" : "active", "createDateTime" : 1456770003, "startDateTime" : 1456770003, "expireDateTime" : null, "removeDateTime" : null, "extensionDateTime" : null, "cancelled" : false, "mode" : "onceOff", "nextMode" : "none", "profileData" : { "serviceProfileId" : "ecs19", "counter" : 1 } } 
ObjectId("560ed95f6ca6e0703cf26fcc"), "cancelled" : false, "createDateTime" : 1443813727, "expireDateTime" : 1544381999, "extensionDateTime" : null, "instanceId" : null, "mode" : "onceOff", "nextMode" : "none", "ownerId" : "923003309452", "profileData" : { "serviceProfileId" : "ecs19", "counter" : 1 }, "profileId" : "Prov3G,HLRProv", "queuedFor" : "unassigned", "removeDateTime" : 1544381999, "startDateTime" : 1443813727, "state" : "active" } 

Выход:

923003345778 : FreeBundles,LBCNorthParentOffer 

923003345778 : Prov3G,HLRProv 

923003309452 : DiscountOnUsage,Segment04 

923003309452 : Prov3G,HLRProv 

Пожалуйста, объясните мне подробно ответ, если кто-нибудь знает.

+0

Это работа для jq или xidel, а не для sed. –

+0

Итак, вы хотите, чтобы мы предоставили вам код, не прилагая усилий самостоятельно? Пожалуйста, смотрите: http://stackoverflow.com/help/how-to-ask –

ответ

1
$ sed 's/.*ObjectId("\([^"]*\).*"profileId" *: *"\([^"]*\).*/\1 : \2/' file 
57a046a06f858a9c73b3468a : FreeBundles,LBCNorthParentOffer 
57a046a06f858a9c73b34688 : Prov3G,HLRProv 
56d48bd38a8b93baa708fcfa : DiscountOnUsage,Segment04 
560ed95f6ca6e0703cf26fcc : Prov3G,HLRProv 

Я действительно не думаю, что любое объяснение нужно, поскольку это очень прямо вперед, но дайте мне знать, если у вас есть какие-либо вопросы.

+1

спасибо, что он сделал работу, мне нужен ownerId вместо ObjectId, поэтому я меняю его на 'sed '/.* ownerId": "\ ([^ "] * \). *" profileId "*: *" \ ([^ "] * \). */\ 1: \ 2/'' – user7352907

0

Это довольно неудобная ситуация, в которой вам удалось вложить себя.

Как правило, вы не хотите обрабатывать структурированные данные с помощью текстовых инструментов, таких как sed. Любое решение, которое вы придумали, будет хрупким в результате форматирования изменений (таких как пробелы или символы новой строки между полями JSON), и некоторые угловые случаи (такие как строки JSON с кавычками в них) неудобны для обработки с ним. Если у вас JSON, вы хотите использовать инструмент JSON для его обработки.

Однако у вас точно нет JSON. Это текстовое представление BSON (вероятно, от MongoDB), которое уже частично отрублено.

То, что вы действительно хотите сделать

вменяемый способ решить эту проблему, чтобы сделать MongoDB дать вам JSON и пусть что-то вроде jq сделать форматирование. Если у вас есть соответствующий файл в формате JSON, это будет так же просто, как

jq -r '"\(.ownerId) : \(.profileId)"' file.json 

mongoexport может быть вашим другом здесь, или положить JSON.stringify() вокруг вашего запроса в MongoDB оболочки ; это зависит от того, как вы получили эти данные в первую очередь. Этот подход потребует сохранения сохраненных данных, но в любом случае я подозреваю, что все, что заставило вас нарезать BSON на части, должно быть заменено чем-то похожим на повышение надежности.

Если у вас есть данные из оболочки MongoDB, вы можете захотеть сделать там форматирование.

Как взломать себя глубже в эту неразбериху с SED

Однако, так как вы в настоящее время не имеют надлежащего JSON, вы можете попытаться взломать себя из этой путаницы с СЭД. Это ужасная идея, и я не могу подчеркнуть, что вы никогда не никогда хотите сделать это в производственной среде. Если вы это сделаете, вы окажетесь в более глубоком беспорядке, чем раньше, и такой порочный круг не является счастливым местом.

Итак, то, что я собираюсь показать вам, это то, что вы делаете как одноразовое в спешке и никогда не будете использовать снова, потому что обещаете, что сделаете это правильно в следующий раз. Вы хотите, чтобы внимательно просмотрите результаты. Здесь идет:

sed 'h;/^.*"profileId"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/!d;s//\1/;x;/^.*"ownerId"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/!d;s//\1/;G;s/\n/ : /' file.bsonish 

Это делает следующие предположения относительно входных данных:

  1. Один полный объект в каждой строке. Новые строки в неправильном месте нарушают это.
  2. в Нет " либо ownerId или profileID поле

Кроме того, он не признает сломанные данные, которые всегда приятная особенность. С другой стороны, не требуется, чтобы поля ownerId и profileId отображались в любом конкретном порядке.

Он работает следующим образом:

# Save a copy of the input data; we'll isolate the fields separately. 
h 

# See if there's a profileId field. If not, the line is silently dropped. 
/^.*"profileId"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/!d 
# Isolate that profileId field. // in this context means: reuse the last 
# regex (the big one) 
s//\1/ 

# Now swap in the saved input data. We'll get ownerId next. 
x 
# Isolate ownerId as before. If there is no ownerId field, drop line silently. 
/^.*"ownerId"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/!d 
s//\1/ 

# append profileId field in hold buffer to what we have 
G 

# Replace the newline between the two with a colon and some spaces. 
s/\n/ :/
Смежные вопросы