Операции с awk-полями

Результат cp -rf source destотличается, если destуже существует.

  • Если destне существует, будет создана копия sourceс именем dest. Предполагая, что sourceсодержит файл f1, он создаст dest/f1.
  • Если destсуществует как каталог и если destне содержит файла с именем source, он скопирует sourceсо всем содержимым вdest. В приведенном выше примере вы получите dest/source/f1.
  • Если destсуществует в виде файла и если sourceявляется каталогом, копирование завершится ошибкой.
  • Если destсуществует как каталог и если destсодержит файл с именем source, копирование завершится ошибкой.
  • Если destсуществует в виде файла и если sourceявляется файлом, он перезапишет destсодержимым source.

Если вы хотите удалить любой существующий каталог назначения, вы можете изменить (cp -rf $cmdline $cmdline$i; ) &на (rm -rf $cmdline$i && cp -rf $cmdline $cmdline$i; ) &.

4
02.02.2021, 14:53
3 ответа

Да, вы можете выполнять любые операции с полями. Например:

$ cat file | awk -F[/.] '{n = split($(NF-1),a,/_/); print $(NF-1)" "a[n]}'
file_name_delimited_by_underscore_123 123
another_example_456 456

Здесь, конечно, не нужно cat; вы могли бы awkпрочитать файл напрямую -, а поскольку разделителем полей вывода по умолчанию OFSявляется пробел, было бы более идиоматично записывать результаты в виде отдельных полей вывода вместо объединения строк:

awk -F[/.] '{n = split($(NF-1),a,/_/); print $(NF-1), a[n]}' file
8
18.03.2021, 22:32

Вы можете использоватьsed:

$ sed -e 's;^.*/\(.*_\)\([0-9]*\)\.[^\.]*$;\1_\2 \2;' file
file_name_delimited_by_underscore_123 123
another_example_456 456

^.*/удаляет путь.

\(.*_\)фиксирует имя до последнего символа подчеркивания.

\.[^\.]*удаляет расширение.

\1\2 \2заменить захваченными группами.

3
18.03.2021, 22:32

С любым sed:

$ sed 's:.*/\(.*_\(.*\)\)\..*:\1 \2:' file
file_name_delimited_by_underscore_123 123
another_example_456 456
6
18.03.2021, 22:32

Теги

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