2013-09-30 64 views
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 

然而,它似乎並沒有真正檢查得當,它打印的數據庫文件,這是不必要的。我對中刪除記錄的代碼是一種shotty的現在藏漢:

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

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

嚴重的是,我不會使用scripts/sed/awk來完成這樣的任務。 Perl或Python將是我的選擇。在腳本工具中做輸入驗證,轉義,引用和類似的事情是非常尷尬的(PITA)。 –

+0

我同意,但我確實需要在shell腳本中編寫它。 = / – Nicktard

回答

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),請在sed參數中添加--posix

相關問題