добавить столбец, заполнить весь столбец именем файла (без «.csv»)-для нескольких файлов в BaSH

/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 выполняет горячее -подключение съемных файлов.

Так что я бы скорее сказал, что есть два способа «подняться»:

  1. команда монтирования
  2. системд

Оба могут быть настроены и расширены в первую очередь через /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.

0
27.05.2021, 15:14
3 ответа

Использование 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
2
28.07.2021, 11:28

Затем выполните цикл по именам файлов и распечатайте столбцы с помощью 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 
(...)
0
28.07.2021, 11:28

Используя 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

, затем

  1. для замены текущего столбца 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
    
  2. добавить отдельный столбец 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
    
  3. чтобы добавить столбец 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соответствующий заголовок будет добавлен к каждому файлу.]

2
28.07.2021, 11:28

Теги

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