jq substr () эквивалентно форматированию значения - PullRequest
3 голосов
/ 03 апреля 2020

Надеюсь, у тебя все хорошо.

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

Используя 'jq', я хочу изменить все даты, например. 19731013 (строка) на 1973-10-13

[
    {
        "Mail": "john@example.com",
        "Name": "Smith",
        "Employee_Number": "000555",
        "First_Name": "John",
        "Company": "ACME",
        "Department": null,
        "Employment_Status": "Retiree",
        "Start_Date": "19770516",
        "Function_Start_Date": "19770516",
        "Group_Phone": "",
        "Job_Title": "Operations Manager Warehousing",
        "Sub_Group": "Exempts",
        "Location": "Tibuktu",
        "Organizational_Unit": null,
        "Date_of_Birth": "19560719",
        "Gender": "1"
    },
    {
        "Mail": "mary@example.com",
        "Name": "Smith",
        "Employee_Number": "000777",
        "First_Name": "Mary",
        "Company": "ACME",
        "Department": null,
        "Employment_Status": "Retiree",
        "Start_Date": "19770516",
        "Function_Start_Date": "19770516",
        "Group_Phone": "",
        "Job_Title": "Manager",
        "Sub_Group": "Exempts",
        "Location": "Tibuktu",
        "Organizational_Unit": null,
        "Date_of_Birth": "19560719",
        "Gender": "2"
    }
] 

Можно ли использовать substr(.Start_Date,1,5)"-"substr(.Start_Date,6,2)"-"substr(.Start_Date,8,3) как с awk в CSV?

Может быть, я смотрю на стену, пропуская дверь справа?

ОБНОВЛЕНИЕ: Большое спасибо, ребята, это сработало как шарм!

jq -r '.[].Start_Date |= "\(.[0:4])-\(.[4:6])-\(.[6:8])" | .[].Function_Start_Date |= "\(.[0:4])-\(.[4:6])-\(.[6:8])" | .[].Date_of_Birth|="\(.[0:4])-\(.[4:6])-\(.[6:8])"' employees.json > test.json

Ответы [ 2 ]

4 голосов
/ 03 апреля 2020

В JQ у нас есть срез строки и интерполяция строки синтаксиса для этого.

$ jq '.[].Start_Date | "\(.[0:4])-\(.[4:6])-\(.[6:8])"' file
"1977-05-16"
"1977-05-16"
3 голосов
/ 03 апреля 2020

В jq также есть функция соответствия регулярному выражению, использующая capture, которая генерирует именованные захваченные группы, к которым позже можно присоединить -, чтобы сформировать строки даты, как вы хотели.

jq '.[].Start_Date | capture("(?<x>[0-9]{4})(?<y>[0-9]{2})(?<z>[0-9]{2})") | join("-")'

Предполагается, что ваше поле Start_Date имеет длину не менее 8 символов и не проверяет на длины, меньшие этой.

...