我正在尝试编写脚本作为我的注册表单的一部分。一切都已设置,但是,我想实现一个类似于UID在bash中的工作方式的“UID”功能。然而,这是一个棘手的部分:每次添加用户时,我将实现的UID将增加1,如果该用户删除他/她的帐户,他的帐户将从数据库中删除,从而删除用于他的UID。我想要用来检查现有UID的脚本,如果存在差异,它会填补它。
实施例
Name:UID
Apple:0001
Bag:0002
Cat:0003
Dog:0004
Cat删除了他的帐户,因此新列表将
Apple:0001
Bag:0002
Dog:0004
如果新用户创建了帐户,则应该
Apple:0001
Bag:0002
NEWUSER:0003
Dog:0004
所有内容都已修复,包括从数据库中删除帐户我实际上无法实现UID的增量及其填写缺失数字的能力。很多人会非常感谢!非常感谢你!
编辑:我对sed和cmp的使用方法有了大致的了解,同时将它们放入循环结构中但不足以将它们变成我想要的结果。
答案 0 :(得分:1)
维护一个免费索引的列表(数组),如果有的话,用它来查找一个免费索引:
declare -a free_indexes=()
...
if [[ action == "remove" ]]; then
free_indexes=( ${free_indexes[@]} $removed_index )
elif [[ action == "add" ]]; then
if [[ ${#free_indexes[@]} -ne 0 ]]; then
index=${free_indexes[0]}
unset free_indexes[0]
free_indexes=( ${free_indexes[@]} )
else
index=next_index
fi
fi
答案 1 :(得分:0)
awk 解决方案:
我们假设关键文件名为users
并且在 Cat删除其帐户后有以下内容:
Name:UID
Apple:0001
Bag:0002
Dog:0004
awk -v nuser="NEWUSER" -F':' 'NR>1 && uid && (int($2)-uid>1){
$0=sprintf("%s:%04d\n%s",nuser,uid+1,$0) }
{ uid=int($2) }1' users > tmp$$ && mv tmp$$ users
处理后的 users
文件:
Name:UID
Apple:0001
Bag:0002
NEWUSER:0003
Dog:0004
答案 2 :(得分:0)
假设uids.txt存在
cat uids.txt
Apple:0001
Bag:0002
Dog:0004
您可以使用bash-fun lib以功能方式完成工作:)
source <(curl -Ls https://raw.githubusercontent.com/ssledz/bash-fun/master/src/fun.sh)
next_id() {
prepend $(tup 0 0) | cut -d':' -f2 \
| map lambda a . 'echo $((a))' | sort \
| scanl lambda acc el . 'cnt=$(tupl $acc); cnt=$((cnt+1)); tup $cnt $el' \
| filter lambda a . 'cnt=$(tupl $a); el=$(tupr $a); [[ $cnt -ne $a ]] && ret true || ret false' \
| tupl | fold -w 1 | append 0 0 0 0 | take 4 | revers | join ''
}
echo NEWUSER:$(cat uids.txt | next_id) | cat - uids.txt |sort -t ':' -n -k2
你应该得到
Apple:0001
Bag:0002
NEWUSER:0003
Dog:0004
在这里,您可以找到关于此库的演示文稿:fun.sh
答案 3 :(得分:0)
无论输入文件的顺序或输入文件有多少间隙或这些间隙有多大,这都会有效:
$ cat addUser.awk
BEGIN { FS=OFS=":"; min=max=1 }
NR==1 { print; next }
{
uid = $2+0
uid2user[uid] = $1
min = (min > uid ? uid : min)
max = (max < uid ? uid : max)
}
END {
fmt = "%s" OFS "%04d\n"
for (uid=min; uid<=max; uid++) {
if (uid in uid2user) {
printf fmt, uid2user[uid], uid
}
else if (newUser != "") {
printf fmt, newUser, uid
newUser = ""
}
}
if (newUser != "") {
printf fmt, newUser, uid
}
}
$ cat users1
Name:UID
Cat:0003
Apple:0001
Dog:0004
Bag:0002
$ awk -v newUser="NEWUSER" -f addUser.awk users1
Name:UID
Apple:0001
Bag:0002
Cat:0003
Dog:0004
NEWUSER:0005
$ cat users2
Name:UID
Bag:0002
Dog:0004
Apple:0001
$ awk -v newUser="NEWUSER" -f addUser.awk users2
Name:UID
Apple:0001
Bag:0002
NEWUSER:0003
Dog:0004
$ cat users3
Name:UID
$ awk -v newUser="NEWUSER" -f addUser.awk users3
Name:UID
NEWUSER:0001
$ cat users4
Name:UID
Bag:0002
Dog:0004
Apple:0001
Frog:0006
$ awk -v newUser="NEWUSER" -f addUser.awk users4
Name:UID
Apple:0001
Bag:0002
NEWUSER:0003
Dog:0004
Frog:0006
$ cat users5
Name:UID
Bag:0002
Apple:0001
Frog:0006
$ awk -v newUser="NEWUSER" -f addUser.awk users5
Name:UID
Apple:0001
Bag:0002
NEWUSER:0003
Frog:0006
答案 4 :(得分:0)
考虑到你的Input_file与显示的示例相同,所以我在这里通过你的语句2场景考虑。 假设我们有以下Input_file:
cat Input_file
Name:UID
Apple:0001
Bag:0002
Dog:0004
Billi:0016
ascs:0018
ewdwdwd:0022
qce:0023
ooidw:24
fewfewf:30
第一名当只有一位名为NEW_USER的用户必须在任何地方输入时,以下内容可能对您有所帮助。
awk -v new="NEW_USER" -F":" '
NR==$2+1;
NR!=$2+1{
q=NR-1;
while(q<$2){
q=sprintf("%04d",q);
print new":"q;
q++
};
NR=q+1;
print
}' Input_file
输出如下。
Name:UID
Apple:0001
Bag:0002
NEW_USER:0003
Dog:0004
NEW_USER:0005
NEW_USER:0006
NEW_USER:0007
NEW_USER:0008
NEW_USER:0009
NEW_USER:0010
NEW_USER:0011
NEW_USER:0012
NEW_USER:0013
NEW_USER:0014
NEW_USER:0015
Billi:0016
NEW_USER:0017
ascs:0018
NEW_USER:0019
NEW_USER:0020
NEW_USER:0021
ewdwdwd:0022
qce:0023
ooidw:24
NEW_USER:0025
NEW_USER:0026
NEW_USER:0027
NEW_USER:0028
NEW_USER:0029
fewfewf:30
第二名:我在考虑如果您有多个用户,例如new_user1,new_user2等等(我在您的声明中预测您提到了许多缺少用户,以防您有多个用户在表格中更新。
awk -v new="NEW_USER,NEW_USER1,NEW_USER2,NEW_USER3" -F":" 'BEGIN{
len=split(new, a,",")
}
NR==$2+1;
NR!=$2+1{
q=NR-1;
while(q<$2){
q=sprintf("%04d",q);
if(i==len){
i=""
};
print a[++i]":"q;
q++
};
NR=q+1;
i="";
print
}' Input_file
输出如下。
Name:UID
Apple:0001
Bag:0002
NEW_USER:0003
Dog:0004
NEW_USER:0005
NEW_USER1:0006
NEW_USER2:0007
NEW_USER3:0008
NEW_USER:0009
NEW_USER1:0010
NEW_USER2:0011
NEW_USER3:0012
NEW_USER:0013
NEW_USER1:0014
NEW_USER2:0015
Billi:0016
NEW_USER:0017
ascs:0018
NEW_USER:0019
NEW_USER1:0020
NEW_USER2:0021
ewdwdwd:0022
qce:0023
ooidw:24
NEW_USER:0025
NEW_USER1:0026
NEW_USER2:0027
NEW_USER3:0028
NEW_USER:0029
fewfewf:30