2016-04-10 32 views
0

我正在編寫一個腳本來驗證文件中是否有一些更改是正確的。我們的想法是找到新的變化和這些值與舊的相比,我可以看到什麼是被改變,因爲文本文件,每行有以下結構的參數:如何編寫腳本來驗證長文本文件中的更改?

TR_Partner=google 
TR_New_Partner=google# 

每當有第一行是原始值,下面一行包含相同的名稱,只是添加了「」和新值(本例中爲google#)。我需要一個腳本,可以檢查在很長的文本文件中的所有行,以檢查是否所有的新值與原始值匹配,我嘗試這樣做:

#!/bin/bash 


partner="$(grep -m1 Partner test.txt | cut -d"=" -f2)" 
new_partner="$(grep -m1 New_Partner test.txt | cut -d"=" -f2)" 

Data="$(grep -m1 Data test.txt | cut -d"=" -f2)" 
New_Data="$(grep -m1 New_Data test.txt | cut -d"=" -f2)" 

Direction="$(grep -m1 Direction test.txt | cut -d"=" -f2)" 
New_Direction="$(grep -m1 New_Direction test.txt | cut -d"=" -f2)" 


if [ $partner != $new_partner ]; then 
    echo "warning invalid data" 
    exit 1; 
fi 
if [ $Data != $New_Data ]; then 
    echo "warning invalid data" 
    exit 1; 
fi 
if [ $Direction != $New_Direction ]; then 
    echo "warning invalid data" 
    exit 1; 
fi 

我測試了這樣的代碼: bash script.sh test.txt和所需的輸出是這樣的,因爲谷歌不會與谷歌#匹配:

warning invalid data 

,但是這是一個很不錯的辦法,因爲它不一般的工作,我需要找到一種方法來完成這項任務,我想感謝任何有關如何繼續完成這項艱鉅任務的建議或暗示。

的所述file.txt是這樣的:

ENTERPRISE 
AB_EDI_Number=number 
AB_Partner=google 
AB_New_Partner=google#  
AB_Data_Type=null 
AB_New_Data_Type=null 
AB_Address=address 
AB_New_Address=address 
+1

使用'diff'這就是它的目的,並沒有多少意義在嘗試重新創建它......或者把你的文件放到版本控制系統中。 – beroe

回答

1

這樣的事情。

last_key="" 
last_value="" 
# read line by line 
while read -r line; do 
    # split at = into pairs 
    IFS="=" read -r key value <<< "$line" 
    # Check if key contains "New" and the value from the line before is 
    # different from the value in the current line. Note: uses bash 
    # extended test ([[]]), use grep for posix shell. 
    if [[ "$key" == *New* ]] && [ "$last_value" != "$value" ]; then 
     echo "warning: $last_value != $value" 
     exit 1 # omit if you want to find all differences 
    fi 
    # save value, key for the next iteration 
    last_key="$key" 
    last_value="$value" 
done < "$1" 
+0

謝謝,我非常感謝你對這項艱鉅任務的幫助,這非常有用。 – neo33

1

這將顯示已經改變的值的字段名稱:

sed 's/_New_/_/' file.txt | uniq | sed 's/=.*//' | uniq -d 

實施例(只考慮輸入線3-6爲了簡潔):

1st sed

TR_Partner=google 
TR_New_Partner=google# 
TR_Data_Type=null 
TR_New_Data_Type=null 

- >

TR_Partner=google 
TR_Partner=google# 
TR_Data_Type=null 
TR_Data_Type=null 

第一uniq的:除去相鄰的重複行(具有不變值的字段)

TR_Partner=google 
TR_Partner=google# 
TR_Data_Type=null 
TR_Data_Type=null 

- >

TR_Partner=google 
TR_Partner=google# 
TR_Data_Type=null 

第二sed的:刪除 「=」 與一切以下

TR_Partner=google 
TR_Partner=google# 
TR_Data_Type=null 

- >

TR_Partner 
TR_Partner 
TR_Data_Type 

第二uniq的:顯示重複線(與改變的值的字段)

TR_Partner 
相關問題