Печатайте два рисунка только при появлении второго рисунка - PullRequest
0 голосов
/ 29 апреля 2019

Как я могу напечатать имя с помощью Score только в том случае, если у человека есть оценка по предмету на английском языке.

Другими словами, подбирайте 2 шаблона и печатайте первый и второй шаблон только при совпадении 2-го шаблона.

ВХОД:

            {
                "sessionId": "000001",
                "name": "ABC",
                "Age": "21",
                "Score": {
                    "English": "A+",
                    "Mathematics": "B-",
                    "String Theory": "C+"
                }
            },
            {
                "sessionId": "000001",
                "name": "CDE",
                "Age": "21",
                "Score": {
                    "English": "A-",
                    "German": "B-",
                    "French": "C+"
                }
            },
            {
                "sessionId": "000001",
                "name": "EFG",
                "Age": "21",
                "Score": {
                    "German": "A+",
                    "Mathematics": "B-",
                    "Machine Learning": "C+"
                }
            },

OUTPUT

"name": "ABC",
"English": "A",
"name": "CDE",
"English": "A",

Ответы [ 6 ]

2 голосов
/ 29 апреля 2019

Если ваши входные данные на самом деле являются правильным массивом JSON, а не его фрагментом:

$ jq -r '.[] | select(.Score.English) | {name: .name, English: .Score.English} | @text' demo.json | sed 's/^{\|}$//g; s/,/\n/'
"name":"ABC"
"English":"A+"
"name":"CDE"
"English":"A-"
0 голосов
/ 29 апреля 2019

Это может сработать для вас (GNU sed):

sed -n '/name/h;/English/!b;H;g;s/^\s*//Mgp' file

Включите дополнительную печать с помощью параметра -n.

Скопировать строку, содержащую name.

Выбросить строки, которые не содержат English.

Добавить строку, содержащую English, к строке name.

Заменить текущую строку содержимым пробела.

Удалите все пробелы в начале любой строки и напечатайте результат.

0 голосов
/ 29 апреля 2019
$ jq 'select (.Score.English) | {name, English: .Score.English}' < <(sed 's/},/}/' file) | sed -n 's/^  *//p'
"name": "ABC",
"English": "A+"
"name": "CDE",
"English": "A-"

.

$ cat tst.awk
{
    gsub(/^[[:space:]]+|[[:space:]]*,?[[:space:]]*$/,"")
    key = $1
    gsub(/^"|"[^"]*$/,"",key)
    f[key] = $0
}
key == "English" {
    print f["name"] ORS $0
}

$ awk -f tst.awk file
"name": "ABC"
"English": "A+"
"name": "CDE"
"English": "A-"

С обоими из вышеупомянутых, если в будущем вы хотите напечатать что-нибудь еще, например. Age, вы просто следуете существующему шаблону, чтобы добавить их в список.

0 голосов
/ 29 апреля 2019

Sed раствор:

sed -n 's/^ *//;/name/h;/English/{H;g;p;}'
0 голосов
/ 29 апреля 2019

еще awk с проверкой формата битов

$ awk '/"name":/         {n=$0} 
       /"Score":/        {s=1} 
       s && /}/          {s=n=""} 
       s && /"English":/ {print n ORS $0}' file | awk '$1=$1'

"name": "ABC",
"English": "A+",
"name": "CDE",
"English": "A-",

проверяет, есть ли «English» в элементе «Score».

0 голосов
/ 29 апреля 2019

Вы можете использовать awk, в первом блоке пробелы удалены. Во втором блоке, если видна строка, содержащая «имя», сохраните ее в переменной с именем name, а затем, если одна из следующих строк содержит English, выведите ранее захваченную переменную name вместе с текущей строкой. ,

awk -F: '{sub(/^[[:space:]]+/,"")} /name/{name=$0} /English/{print   name ORS $0}'
"name": "ABC",
"English": "A+",
"name": "CDE",
"English": "A-",
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...