我有一个.bd文档,其中每本书都有行。每本书都有标题,作者等,并以\t
分隔。每行的最后一个字符可以是1或0,这取决于是否借用了这本书。我需要一种更改该数字的方法,以使用id(该行的第一个数字)来更改图书的状态。
1 title1 author1 genre1 year1 shelv1 0
2 title2 author2 genre2 year2 shelv2 0
3 title3 author3 genre3 year3 shelv3 0
答案 0 :(得分:1)
基于所有id是整数的假设:
$ 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
我还写了一个不创建两个数组的数组,但后来认为这不值得。
答案 1 :(得分:1)
要将ID 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 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR