2014-11-05 102 views
0

我正在嘗試編寫一個腳本,該腳本從基於文本的數據庫中刪除一行,如果標題與該標題的字段匹配。例如,我有一個文本文件,它看起來像從bash中的文本文件中刪除一行?

Name Age Identification Wage 
Micheal 25 19339 10 
Jane 37 19338 10 
John 21 19334 12 
Peter 35 19330 30 

我調用腳本,並通過標題名稱和值,它看起來對包含該標題下該值的線,並及時將其刪除。因此,把

./script.sh filename Identification 19334 

應該刪除其標識爲19334數據庫的條目,以便該文件現在看起來是這樣:

Name Age Identification Wage 
Micheal 25 19339 10 
Jane 37 19338 10 
Peter 35 19330 30 

我將如何使用awk腳本,或sed的,以刪除特定的行?

回答

0
awk -v val=$3 -v hdr=$2 '{for(i=1; i<=NF; i++){if($i==hdr && NR==1){col=i;break}} if($col!=val){print}}' $1 > newfile && mv newfile $1 
1

這AWK不會直接更新文件,但會產生所需的輸出:

awk -v header="Identification" -v value="19334" 'NR==1 {for(i=1;i<=NF;i++) cols[$i]=i} $(cols[header])!=value' data 
Name Age Identification Wage 
Micheal 25 19339 10 
Jane 37 19338 10 
Peter 35 19330 30 
  • 可變header使用-v標誌
  • value被設置爲值以匹配設定Identification使用另一個-v標誌
  • 設置cols關聯數組,以便爲​​列標頭分配其字段編號
  • 最後,打印任何行的header表示列不匹配value

匹配value多個行會被刪除。

我的bash福較弱,但會做你想要什麼:

#!/bin/bash 

newFile=$(awk -v header="$2" -v value="$3" 'NR==1 {for(i=1;i<=NF;i++) cols[$i]=i 
} $(cols[header])!=value' $1); 

echo "$newFile" > $1 

的bash腳本會:

  • 分配awk腳本的結果給newFile變量,其中$2是標題,$3是值,而$1是輸入文件。
  • 覆蓋的newFile變量的內容在第一個參數的內容,$ 1

如你所描述你可以運行它:

./script.sh data Identification 19334 

從而改變原來的文件,併產生:

Name Age Identification Wage 
Micheal 25 19339 10 
Jane 37 19338 10 
Peter 35 19330 30 

一個需要注意的是拼寫錯誤的標頭將覆蓋與原來內容的全部文件,並可能離開你想知道爲什麼它不起作用。

+1

重定向'$ NEWFILE」> $ 1'是可愛的,但不標準的做法。典型的解決方案是'的awk '{腳本的東西}' 文件> file.new && MV file.new file'。這不僅會'awk'程序沒有任何錯誤時''mv' file.new。將巨型文件存儲到變量(如$ newFile)中是可能的,但在出現問題時很難調試。祝你們好運。 – shellter 2014-11-05 04:11:55