增加和修改列表

时间:2017-08-25 10:45:42

标签: bash awk sed uid cmp

我正在尝试编写脚本作为我的注册表单的一部分。一切都已设置,但是,我想实现一个类似于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的使用方法有了大致的了解,同时将它们放入循环结构中但不足以将它们变成我想要的结果。

5 个答案:

答案 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
相关问题