0

我问了一个类似的问题,但答案似乎给我带来了一些问题。我的总体目标是能够从特定数据库中删除特定记录。

databases.txt 包含:

class grades

schema.txt 包含:

grades name test1 test2 test3

class.db 包含:

Nick 79 84 85
You 24 83 52
Her 84 98 55

所需的输入是:

./del.sh class test2 84

我的目标是删除 test2 和 class 所属的 db 中任何带有“84”的行。

我使用以下方法验证数据库的存在:

awk '{ print $1 }' databases.txt >> temp.txt

if  grep -Fxq $1 temp.txt 
then
    rm temp.txt
    touch temp.txt
else 
    echo "Database name error. Exiting."
    rm temp.txt
    exit 1
fi

我当前的问题是验证 test2 属于属于用户输入的数据库的架构,如果该字段在该架构中不存在,则打印一条错误消息。

我之前得到的回复是:

awk 'NR==FNR{a[$1]=$0;next}a[$2]~/$2/{print $0}' schemas.txt databases.txt

但是,它似乎并没有真正正确检查,它会打印不必要的数据库文件。我删除记录的代码现在也有点糟糕:

var=$(grep -c $3 $1.db)
delrec=$3

echo "There were" $var "records deleted from the $1 database."
sed -i "/$delrec/d" $1.db
4

1 回答 1

0
#!/bin/ksh
SchemaRef="`sed -n \"/$1 / s/^[^ ]* //p\"`"
if [ -z ${SchemaRef}" ]
  then
    return 1
  fi

FieldNr="`sed -n \"/^${SchemaRef} / s/ /\
/gp\" schema.txt | grep -n | sed -n \"/:$2$/ s/^[^:]:/\1/p\"`"
if [ -z ${FieldNr}" ]
  then
    return 2
  fi

FieldBefore=$(( ${FieldNr} - 1 ))
sed -n "/\([^ ]\{1,\} \)\{${FieldBefore}\}$3 / !p" $1.db

类似的东西(这里没有unix来验证)。如果在 linux 下使用(或与 GNU sed 一起使用)添加 --posix 到 sed 参数

于 2013-11-04T20:03:58.190 回答