Give в file containing lines of text such схвати
"00007960-9d81-4192-b548-ad33d6b0ca54","true",0.984725773335,"false",1.0,"true",0.808817088604,"false",0.705779910088,"false",0.928222000599,"false",0.999984204769,"false",1.0,"false",0.904409646988,"true",0.979391694069,"true",0.977430343628,"false",0.999999582767
what is the будьте (or сходный) command to fix this file so the second to last boolean оцените on each line is повторно нравьтесь with the opposite оцените. So for some lines the оцените "false" will become "true", and for others the оцените "true" will become "false"
"00007960-9d81-4192-b548-ad33d6b0ca54","true",0.984725773335,"false",1.0,"true",0.808817088604,"false",0.705779910088,"false",0.928222000599,"false",0.999984204769,"false",1.0,"false",0.904409646988,"true",0.979391694069,"false",0.977430343628,"false",0.999999582767
(я заметил the second to last true ты существуешь become false)
Попробуйте awk
:
awk -F, 'BEGIN{a["\"true\""] = "\"false\""; a["\"false\""] = "\"true\""; OFS=","} {$(NF - 3) = a[$(NF - 3)]}1'
Это предполагает, что третье последнее поле каждой записи "true"
или "false"
.
следующие тесты, если третье последнее поле "true"
или "false"
:
awk -F, 'BEGIN{a["\"true\""] = "\"false\""; a["\"false\""] = "\"true\""; OFS=","} $(NF -3) in a {$(NF - 3) = a[$(NF - 3)]}1'
С bash
:
#!/bin/bash
while IFS=, read -r -a line; do
if [ "${line[@]:(-4):1}" = \"true\" ]; then
IFS=,; printf '%s\n' "${line[*]:0:$((${#line[@]}-4))},\"false\",${line[*]:(-3)}"
else
IFS=,; printf '%s\n' "${line[*]:0:$((${#line[@]}-4))},\"true\",${line[*]:(-3)}"
fi
done <file.txt
Здесь мы создаем массив из каждой строки с элементами, разделенными по телефону ,
.
Тогда, мы проверяем, является ли 4-й элемент от конца "true"
или "false"
, и затем замена сделана соответственно.