将数据写入文件,检查前一个值并使用awk覆盖它



我需要使用awk来实现一个脚本,而不是使用下面脚本的示例sed。

#!/bin/bash
FILE="data"
revoke_number() {
local number="$1"
while true
do
local pre_voice=$(sed -n "$number"'p' $FILE)
if [ -z $pre_voice ]
then
sed -i "$number"'c:'"$((number - 1))" $FILE
sed -i "$(( number + 1 ))"'s/.*//;' $FILE
number=$(( number - 1 ))
elif [ $number -eq 1 ]
then
break
else
sleep 10
echo "Sleep for 10"
fi
done
}
add_number() {
local second_line=$(sed -n '$=' $FILE)
echo $second_line
if [[ "$second_line" == "1" ]]
then
echo -e "0:$second_line" >> $FILE
echo "Exit"
exit 0
else
echo "To Revoke"
echo -e "0:$second_line" >> $FILE
revoke_number $second_line
fi
}
clear_empty_lines() {
local last_line=$(sed -n '$=' $FILE)
echo "THIS IS LAST $last_line"
for ((i=$last_line; i > 0; i--))
do
echo $i
values=$(sed -n "$i"'p' $FILE)
if [ -z $values ]
then
sed -i "$i"'d' $FILE
else
break
fi
done
}
clear_empty_lines
add_number

脚本正在处理的文件包含:

0:0
0:1
0:2
0:3
0:4
and etc.

这个脚本如何工作的一个例子:该文件包含第0:0行。在启动时,脚本检查最后一个值,看到值0,并用0:1行补充文件(将最后一个值增加1)。

然后再次运行脚本。他看到最后一个值是0:1,于是写了0:2行。但是脚本并没有停止工作,而是继续检查文件是否删除了数字为0:1的行(前一行)。如果我们手动删除文本文件中的0:1行,那么脚本应该看到更改,删除它写入的值0:2并写入0:1。这就是该脚本运行的方式。在启动时写入的值应该检查之前的值,如果从文件中删除,则将其值减少1,即0:5行将检查0:4行,如果删除它将覆盖其值从5到4,重写后将检查0:3行。如果行0:3也被删除,它将用3覆盖4并检查行0:2。

数据信息文件:

0:0
0:1
0:2
0:3
0:4

从文件中删除1行:

0:0
0:1
0:3
0:4

根据释放的行重建数据:

0:0
0:1
0:2
0:3

With GNU awk for "inplace"编辑和ENDFILE(可以使用带有临时文件和END的任何awk以同样的方式完成):

步骤1:创建一个空文件

$ > file
$ cat file
$

步骤2:用一些初始值填充文件,并看到每次都添加一个新行:

$ awk -i inplace 'NF{print "0:" c++} ENDFILE{if (c==NR) print "0:" c+0}' file
$ cat file
0:0
$ awk -i inplace 'NF{print "0:" c++} ENDFILE{if (c==NR) print "0:" c+0}' file
$ awk -i inplace 'NF{print "0:" c++} ENDFILE{if (c==NR) print "0:" c+0}' file
$ awk -i inplace 'NF{print "0:" c++} ENDFILE{if (c==NR) print "0:" c+0}' file
$ awk -i inplace 'NF{print "0:" c++} ENDFILE{if (c==NR) print "0:" c+0}' file
$ awk -i inplace 'NF{print "0:" c++} ENDFILE{if (c==NR) print "0:" c+0}' file
$ cat file
0:0
0:1
0:2
0:3
0:4
0:5

步骤3:删除2行,但你喜欢(我只是碰巧使用awk):

$ awk -i inplace '{print (NR~/3|5/ ? "" : $0)}' file
$ cat file
0:0
0:1
0:3
0:5

步骤4:再次运行脚本,看到上面的4个非空行已经重新编号,并添加了新的第5行:

$ awk -i inplace 'NF{print "0:" c++} ENDFILE{if (c==NR) print "0:" c+0}' file
$ cat file
0:0
0:1
0:2
0:3

如果您没有GNU awk,您可以使用任何awk手动创建/使用临时文件来完成上述操作:

tmp=$(mktemp) &&
awk 'NF{print "0:" c++} END{if (c==NR) print "0:" c+0}' file > "$tmp" &&
mv -- "$tmp" file

最新更新