Bash: Как посчитать количество строк в разделе, увеличить его и добавить еще одну строку - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть два файла и переменная пути:

path = $ 1

file1:

[usera:pathlist]
1=/path
2=/another/path

[userb:pathlist]
1=/path
2=/another/path
3=/one/more/path

[userc:pathlist]
1=/path

file2:

usera
userc

I нужен скрипт, чтобы добавить $path всем пользователям в file1, если они существуют в file2, и увеличить количество строк на единицу.

Результат должен выглядеть следующим образом:

file1:

[usera:pathlist]
1=/path
2=/another/path
3=$path

[userb:pathlist]
1=/path
2=/another/path
3=/one/more/path

[userc:pathlist]
1=/path
2=$path

К сожалению, у меня недостаточно опыта с sed и я не использовал awk еще. Или, может быть, есть другой инструмент, который подходит мне лучше? Я был бы очень благодарен, если бы вы могли привести меня в правильном направлении здесь. Большое спасибо.

Udpdate # 1:

[usera:pathlist]
1=/path
2=/another/path
1=$path

[userb:pathlist]
1=/path
2=/another/path
3=/one/more/path

[userc:pathlist]
1=/path
1=$path

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

еще awk

$ awk -v p='$path' -v ORS='\n\n' -v OFS='\n' 'NR==FNR{a["["$1]; next}
                                                     {split($1,u,":")} 
                                           u[1] in a {$(NF+1)=NF"="p}1' file2 RS= file1

[usera:pathlist]
1=/path
2=/another/path
3=$path

[userb:pathlist]
1=/path
2=/another/path
3=/one/more/path

[userc:pathlist]
1=/path
2=$path

для использования значения $path вместо литерала $path заменить одинарные кавычки на двойные в определении переменной p. Обратите внимание, что RS значение установлено между файлами.

возможно, это проще

$ awk -v p='$path' 'NR==FNR{a["["$1]; next} 
                           {split($1,u,":"); 
                            print $0 ORS (u[1] in a?NF"="p:"") ORS}' file2 RS= file1 
0 голосов
/ 24 апреля 2020
awk -v path="$path" '
  FNR==NR{ u[$1]; next }
  FNR > 1{ print "" }
  {
    add=0
    for (user in u) 
      if ($1 ~ "^\\[" user ":"){ add=1; break }
  }
  1
  add{ print NF "=" path }
' file2 RS="" file1
...