如何在文件的特定行中更改字符

时间:2019-04-07 10:23:18

标签: shell awk

我有一个.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

2 个答案:

答案 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