Awk/sed отделить последний столбец и добавить кавычки вокруг среднего столбца?

Для этого нет стандартного места. Стандартный способ сделать что-то состоит в том, что у вас должны быть привилегии для установки программы в том месте, где ее будут запускать другие пользователи.

Это ваш выбор между поддеревом /usr/local, например /usr/local/users/bin, подкаталогом /home, например /home/shared/bin, подкаталогом /opt, например /opt/users/bin, и т. д.

Используйте путь, оканчивающийся на /bin. Это делает более очевидным, что он предназначен для исполняемой программы, и позволяет вам помещать другие вещи в одноуровневые каталоги, такие как библиотеки,документация и файлы данных, используемые этими программами.

1
28.11.2021, 13:59
3 ответа

Если все, что вы хотите сделать, это удалить только «(цифры )» в конце строки:

sed 's|\(^.*\) ([[:digit:]]*)$|\1|g' test.txt

даст вам:

Metabolism  # this header I need to keep
Global and overview maps  # this header I need to keep
01100 Metabolic pathways
01110 Biosynthesis of secondary metabolites
01120 Microbial metabolism in diverse environments
-3
28.11.2021, 16:14

С GNU sed:

sed -e '1,2{p;d}' -e 's/ /;"/' -e 's/ ([[:digit:]]\+)$/"/' input

или более совместимые:

sed -e '1{p;d;}' -e '2{p;d;}' -e 's/ /;"/' -e 's/ ([[:digit:]]\{1,\})$/"/' input
1
28.11.2021, 16:21

Использование GNU sedв расширенном режиме регулярных выражений -E, где мы идентифицируем строки заголовков как те, которые не заканчиваются числами в квадратных скобках. Предполагая:

  • нет начальных/конечных пробелов.
  • нет последовательных пробелов.
  • ввод имеет окончания строки Unix (\n)
sed -Ee '
  /\s\(([0-9]+)\)$/!s/.*/;"&";/;t
  s//";\1/;s/\s/;"/
' file
;"Metabolism";
;"Global and overview maps";
01100;"Metabolic pathways";1689
01110;"Biosynthesis of secondary metabolites";677
01120;"Microbial metabolism in diverse environments";356

perl -lpe '
  s/\s\K\((\d+)\)$/$1/ ?
    s/\s(.*)\s/;"$1";/ :
    s/(.*)/;"$1";/     ;
' file

Используя perlмы могли бы сделать следующее (те же предположения, что и выше ).

  • хранить первые n последних полей в скалярах $a $b соответственно только для строк, заканчивающихся числами в квадратных скобках.
perl -slane 'local($a,$b);
  ($a,$b) = (shift(@F),pop(@F))
    if /\s\(\d+\)$/;
  print $a, qq("@F"), $b =~ tr/()//dr;
' -- -,=\; file

awk '
$NF ~ /^\([0-9]+)$/ &&
p = match($0,/.* /) {
  l = length($NF)
  mid = substr($0, p, RLENGTH)
  gsub(/^ | $/, "\"", mid)
  print $1, mid, substr($NF, 2, l-2)
}
!p&&(sub(/.*/, ";\"&\";")||1)
' OFS=\; file
1
30.11.2021, 02:30

Теги

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