/etc/fstab — это классический (= pre -systemd )способ настройки команды монтирования. Другими словами, для определения точек монтирования, которые вы можете монтировать, используя более короткий синтаксис.
Без /etc/fstab (без записи )вы должны написать (в оболочке или скрипте):
mount -t spc_fs /dev/exmpl /mnt/point ro
Но если ввести эту информацию в fstab, то достаточно ввести
mount /mnt/point
Это 5-й вариант синтаксиса, который показывает mount --help
.
Монтирование файловых систем начинается с монтирования ядра/initrd root=
и «заканчивается» автоматическим монтированием съемных устройств и созданием tmpfs (виртуальных дисков )в любое время. Плюс петлевое устройство для крепления файлов...
Итак, systemd сам анализирует /etc/fstab, я читал где-то на справочных страницах, и, поскольку он написан на C, он использует библиотечный вызов, а не команду mount. И он также заботится о том, чтобы во время загрузки все монтировалось в нужное время. Это основной бизнес systemd.
А после загрузки systemd -udevd выполняет горячее -подключение съемных файлов.
Так что я бы скорее сказал, что есть два способа «подняться»:
Оба могут быть настроены и расширены в первую очередь через /etc/fstab.
Что касается того, какой "подход" выбрать :, никто толком сказать не может!
Если вы правильно установили systemd от имени пользователя,вам не нужно монтировать себя вообще. Bootup и udevd находится в руках systemd. И пользователю даже не нужно циклично монтировать iso-образ. Он знает только, когда втыкает свой USB, он появляется в /media/usb.
Если вы хотите изучить -, если Linux вынуждает вас быть системным администратором -, просто используйте systemd. «.mount» — это одна из специальных единиц. Он обещает "контроль и наблюдение " за "точками монтирования файловой системы ".
И всегда можно смешать. Возможно, вы хотите, чтобы systemd монтировала «RAM-диск» при загрузке в вашем домашнем каталоге. Но вы можете в любое время создать (еще один )в любом каталоге/точке монтирования с помощью команды mount -t tmpfs none dir
.
Имея на диске всего несколько ГБ, вы можете установить тестовую версию Linux с помощью sysvinit вместо systemd. То, как вы просите, вы должны это сделать. Я на 50% за и на 50% против systemd. ПЫТАЮСЬ ладить с sysvinit и очень простыми скриптами. Я монтирую /proc и /sys при загрузке, а с модулем хранения USB -я, по крайней мере, получаю /dev/sdb, который затем монтирую, иногда к предварительно -определенным точкам в /etc/fstab.
Использование awk
иcolumn
:
$ awk '
NR==1{ sub(/\.csv$/, "", FILENAME) } # remove.csv suffix from FILENAME
NR>1{ $1=FILENAME } # replace the first field with filename
1 # print record
' bcc1_45Fall_10010002.csv | column -t
HUC8 YEAR RO_MM
bcc1_45Fall_10010002 1961 74.7
bcc1_45Fall_10010002 1962 69.1
bcc1_45Fall_10010002 1963 52.0
bcc1_45Fall_10010002 1964 130.7
bcc1_45Fall_10010002 1965 32.2
bcc1_45Fall_10010002 1966 85.4
Вы можете запустить это в цикле оболочки, чтобы сохранить измененные файлы в каталогmodified_files
:
mkdir modified_files &&
for i in *.csv; do
awk 'NR==1{ sub(/\.csv$/, "", FILENAME) } NR>1{ $1=FILENAME }1' "$i" |
column -t > "./modified_files/$i"
done
Если вам нужно заменить столбец HUC8
и это не первый столбец, измените код на этот:
awk -v search='HUC8' '
NR==1{
for(i=1;i<=NF;i++)
if ($i==search){ fld=i; sub(/\.csv$/, "", FILENAME); break }
}
NR>1{ $fld=FILENAME }
1
' file.csv | column -t
Затем выполните цикл по именам файлов и распечатайте столбцы с помощью awk
for f in *.csv;
do
head -1 $f > out/$f
cat $f | awk -v FIN=${f%.csv} 'NR>1 {print FIN, $2, $3}' >> out/$f
done
HUC8 YEAR RO_MM
bcc1_45Fall_10010002 1961 74.7
(...)
Используя Miller и предполагая, что ваши файлы являются «простыми» CSV (без запятых в полях и т. д. -вы можете изменить --csvlite
на --csv
если требуется полная поддержка RFC -4180)
$ cat bcc1_45Fall_10010002.csv
HUC8,YEAR,RO_MM
10010002,1961,74.7
10010002,1962,69.1
10010002,1963,52.0
10010002,1964,130.7
10010002,1965,32.2
10010002,1966,85.4
, затем
для замены текущего столбца HUC8
:
$ mlr --csvlite put -S '$HUC8 = substr(FILENAME,0,-5)' bcc1_45Fall_10010002.csv
HUC8,YEAR,RO_MM
bcc1_45Fall_10010002,1961,74.7
bcc1_45Fall_10010002,1962,69.1
bcc1_45Fall_10010002,1963,52.0
bcc1_45Fall_10010002,1964,130.7
bcc1_45Fall_10010002,1965,32.2
bcc1_45Fall_10010002,1966,85.4
добавить отдельный столбец Name
:
$ mlr --csvlite put -S '$Name = substr(FILENAME,0,-5)' bcc1_45Fall_10010002.csv
HUC8,YEAR,RO_MM,Name
10010002,1961,74.7,bcc1_45Fall_10010002
10010002,1962,69.1,bcc1_45Fall_10010002
10010002,1963,52.0,bcc1_45Fall_10010002
10010002,1964,130.7,bcc1_45Fall_10010002
10010002,1965,32.2,bcc1_45Fall_10010002
10010002,1966,85.4,bcc1_45Fall_10010002
чтобы добавить столбец Name
в качестве первого столбца:
$ mlr --csvlite put -S '$Name = substr(FILENAME,0,-5)' then reorder -f Name bcc1_45Fall_10010002.csv
Name,HUC8,YEAR,RO_MM
bcc1_45Fall_10010002,10010002,1961,74.7
bcc1_45Fall_10010002,10010002,1962,69.1
bcc1_45Fall_10010002,10010002,1963,52.0
bcc1_45Fall_10010002,10010002,1964,130.7
bcc1_45Fall_10010002,10010002,1965,32.2
bcc1_45Fall_10010002,10010002,1966,85.4
Все вышеперечисленное записывает результат в стандартный вывод -, чтобы изменить файл в месте -, добавьте параметр -I
. Вы можете передавать несколько файлов одновременно, используя оболочки ex. bcc*.csv
или *.csv
.
[При тестировании без-I
строка заголовка не будет повторяться, если в результате неоднородности записи не потребуется новый заголовок; однако с -I
соответствующий заголовок будет добавлен к каждому файлу.]