на основе предположения, что все идентификаторы являются целыми числами:
$ 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
Я также написал один, который не создает двух массивов, но потом подумал, что это не стоит.