Как изменить символ в определенной строке файла - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть документ .bd, в котором есть строки для каждой моей книги.У каждой книги есть название, автор и т. Д., Разделенные на \t.Последний символ каждой строки может быть 1 или 0 в зависимости от того, заимствована книга или нет.Мне нужен способ изменить это число, изменить состояние книги, используя идентификатор (первый номер строки).

1   title1  author1 genre1  year1   shelv1  0
2   title2  author2 genre2  year2   shelv2  0
3   title3  author3 genre3  year3   shelv3  0

Ответы [ 2 ]

1 голос
/ 07 апреля 2019

Чтобы изменить статус идентификатора 2 на 1:

awk -v id=2 -v status=1 'BEGIN{FS=OFS="\t"} $1==id {$NF=status}1' file

Выход:

1       title1  author1 genre1  year1   shelv1  0
2       title2  author2 genre2  year2   shelv2  1
3       title3  author3 genre3  year3   shelv3  0

См .: 8 Мощные встроенные переменные Awk - FS,OFS, RS, ORS, NR, NF, FILENAME, FNR

1 голос
/ 07 апреля 2019

на основе предположения, что все идентификаторы являются целыми числами:

$ awk -v ids='1 3' '
BEGIN{FS=OFS="\t"}
ids~"(^| )"$1"( |$)"{$NF=!$NF}
1' file
1       title1  author1 genre1  year1   shelv1  1
2       title2  author2 genre2  year2   shelv2  0
3       title3  author3 genre3  year3   shelv3  1

для обновления file с выводом команды выше:

awk ... file > tmpfile && mv tmpfile file

обратите внимание, что скрипт вышемасштабируемая, обработка файла, состоящего из> 1000 строк, займет слишком много времени.если вам нужен эффективный и не будет возражать против его длины, вот оно:

awk -v ids='1 3' '
BEGIN {
  split(ids,p)
  for(i in p) q[p[i]]
  FS=OFS="\t"
}
($1 in q) {
  $NF=!$NF
}
1' file

Я также написал один, который не создает двух массивов, но потом подумал, что это не стоит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...