csv в tsv с вложенными кавычками

Я потратил два дня и нашел надежное решение. Я прочитал половину Интернета и пообщался в #systemdIRC. Пожалуйста, прочитайте эту документацию, возможно, это поможет вам; для меня ничего из этого не помогло, я не мог заставить это работать.

https://www.freedesktop.org/wiki/Software/systemd/InitrdInterface/
https://www.freedesktop.org/wiki/Software/systemd/RootStorageDaemons/

В итоге мне пришлось переопределить systemdслужбы, отвечающие за выключение или перезагрузку машины.

Создать каталоги переопределения:

  • /etc/systemd/system/systemd-poweroff.service.d
  • /etc/systemd/system/systemd-reboot.service.d
  • /etc/systemd/system/systemd-halt.service.d

И положить внутрь override.confфайлов.
Дляpoweroff:

[Unit]
SuccessAction=poweroff-immediate

Дляreboot:

[Unit]
SuccessAction=reboot-immediate

Дляhalt(вызывается, например, при использовании кнопки Power Off в Gnome):

[Unit]
ExecStart=systemctl --force --force halt

Добавление второго --forceили immediateделает то, что он говорит. Он не ждет монтирования или других вещей, а просто перезагружает/выключает машину. Для NFS читайте -only mounts, это не опасно и может быть сделано безопасно. Кроме того, все изменения из overlayв моей оперативной памяти также исчезнут, и это нормально. /home, единственное, что меня волнует, будет правильно размонтировано устройством home.mount, созданным автоматически для всех записей fstab.

Я надеюсь, что это избавит кого-то от двух дней разочарования;)

С наилучшими пожеланиями
Камиль

1
05.09.2021, 20:42
2 ответа

bash 5.1 поставляется с загружаемым модулем CSV

BASH_LOADABLES_PATH=${BASH/\/bin\//\/lib\/}
enable -f csv csv
csv -a fields "$line"
new_line=$(IFS=$'\t'; echo "${fields[*]}")
declare -p line fields new_line

выходы

declare -- line="a,\"test, part2 \"\"the start\"\"\",b"
declare -a fields=([0]="a" [1]="test, part2 \"the start\"" [2]="b")
declare -- new_line="a  test, part2 \"the start\"   b"
#.....................^ tab......................^ tab

Это неверно, если есть поле, содержащее вкладку.


В трубопроводе:

IFS=$'\t'
cat file |
while IFS= read -r line; do
    csv -a fields "$line"
    echo "${fields[*]}"
done |
tail

Хотя это более идиоматический баш

IFS=$'\t'
while IFS= read -r line; do
    csv -a fields "$line"
    echo "${fields[*]}"
done < file | tail
4
05.09.2021, 21:54

Или используйтеcsvformatиз csvkit--этот инструмент позаботится о заключении в кавычки любого поля, содержащего разделитель :Я добавил строку во входной файл, в которой есть табуляция.

$ cat a.txt
a,"test, part2 ""the start""",b
c,d,e   with    tabs

$ csvformat -D $'\t' a.txt
a   "test, part2 ""the start""" b
c   d   "e  with    tabs"
0
06.09.2021, 18:49

Теги

Похожие вопросы