Объединение двух файлов CSV в один с помощью AWK

Из справочной страницы systemd -journald :

The journal service stores log data either persistently below /var/log/journal or in a volatile way below /run/log/journal/ (in the latter case it is lost at reboot). By default, log data is stored persistently if /var/log/journal/ exists during boot, with an implicit fallback to volatile storage otherwise. Use Storage= in journald.conf(5) to configure where log data is placed, independently of the existence of /var/log/journal/.

Таким образом, журнал можно и безопасно хранить в другом месте. Вам останется только добавить/изменить

Storage=/some-filesystem-with-free-space/some-dir/

в один из файлов конфигурации journald .

1
07.07.2020, 21:26
1 ответ

Попробуйте:

$ awk -F, 'FNR==NR{a[$1]=$2;next} $1 in a{$3=a[$1]} 1' OFS=, file2.csv file1.csv
alice,soccer,5
bob,baseball,21
jessica,swimming,9
mike,running,20

Как это работает

  • -F,

    Это устанавливает запятую в качестве разделителя полей ввода.

  • FNR==NR{a[$1]=$2;next}

    При чтении file2.csvэто сохраняет второе поле под ключом первого поля в массиве a.

    Обратите внимание на использование next. Это говорит awk пропустить остальные команды и начать заново со следующей строки.

    Например, после прочтения вашего file2.csvсодержимое массива aравно:a['alice']=5и a['jessica']=9.

  • $1 in a{$3=a[$1]}

    При чтении file1.csv, если первое поле существует как ключ в массиве a, то это обновляет третье поле до значения, сохраненного в a.

    Тест $1 in aверен, если содержимое $1(, которое мы читаем из file1.csv), является одним из ключей (, а не одним из значений )массива a.

  • 1

    Это сокращение от {print}.

  • OFS=,

    Это устанавливает запятую в качестве разделителя выходных полей.

2
18.03.2021, 23:21

Теги

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