2014-02-26 96 views
1

我有2名不同的目錄2個CSV文件,我對他們運行的差異是這樣的:登錄diff命令,以單獨的文件輸出在linux

diff -b -r -w <dir-one>/AFB.csv <dir-two>/AFB.csv 

我得到的輸出作爲預期:

14c14 
< image_collapse,,collapse,,,,,batchcriteria^M 
--- 
> image_collapse1,,collapse1,,,,,batchcriteria^M 
16a17 
> image_refresh,,refresh,,,,,batchcriteria^M 

我的要求是,改變的行應該改變.log文件,已經附加的行應該附加append.log。

輸出清楚地顯示14c14中的「c」意味着該行已經改變,而16a17中的「a」意味着已添加行。但是,我如何將它們記錄在不同的日誌文件中。

+0

這不是微不足道,因爲它看起來:你首先需要找到一種可靠的方法來分離大塊,那麼你需要分析每個大塊決定在哪個文件把它。如果我是你,我會使用像Python這樣的真正的編程語言來完成它,因爲這只是一場噩夢而已。 –

+0

@MichaelSchlottke:不能使用任何編語言,必須以某種方式在bash中完成。 :( – 6055

回答

1

編輯:與以下原始答案相同,但避免選項在HP-UX上不受diff支持。使用類似:

diff -b -r -w /tmp/one.txt /tmp/two.txt \ 
| sed -n -e '/c/ {s/[^c]*c\(.*\)/\1 p/;p}' \ 
| sed -n -f - /tmp/two.txt > /tmp/changed.txt 

diff -b -r -w /tmp/one.txt /tmp/two.txt \ 
| sed -n -e '/a/ {s/[^a]*a\(.*\)/\1 p/;p}' \ 
| sed -n -f - /tmp/two.txt > /tmp/new.txt 

此行號輸出轉換從diffsed打印(p)爲增加(a)和變更的命令(c)行範圍。生成的sed腳本將應用於第二個文件以僅打印所需的行。 (我希望HP-UX sed從標準輸入接收腳本支持-f -


似乎有是不需要從diff輸出解釋行號的解決方案。 diff支持--side-by-side格式(-y),其中包括分別用<,>|標記舊,新和改變的線條的排水槽。您可以使用--width=1(或-W1)將此並排格式減少爲標記。如果您使用已更改的標記和新的標記(grep -v)並在第二個文件的行前加上(paste),則可以通過前綴標記篩選(grep)並丟棄標記(cut)。您可以爲新文件和更改文件執行此操作。

這裏是一個自包含的「腳本」爲例:

# create two example files (one character per line) 
echo abcdefghijklmnopqrstuvwxyz | grep -o . > /tmp/one.txt 
echo abcDeFghiJKlmnopPqrsStuvVVwxyzZZZ | grep -o . > /tmp/two.txt 

# diff side-by-side to get markers and apply to new file 

diff -b -r -w -y -W1 /tmp/one.txt /tmp/two.txt \ 
| fgrep -v '<' | paste - /tmp/two.txt \ 
| grep -e '^|' | cut -c3- > /tmp/changed.txt 

diff -b -r -w -y -W1 /tmp/one.txt /tmp/two.txt \ 
| fgrep -v '<' | paste - /tmp/two.txt \ 
| grep -e '^>' | cut -c3- > /tmp/new.txt 

# dump result 
cat /tmp/changed.txt 
echo --- 
cat /tmp/new.txt 

它的輸出是

D 
F 
J 
K 
--- 
P 
S 
V 
V 
Z 
Z 
Z 

我希望這可以幫助您解決問題。

+0

非常感謝您的幫助,但我必須在unix(HP-UX)中運行該腳本。在unix中,-y和-W不被識別。僅在UNIX中提示某些內容 – 6055

+0

正在使用[GNU diffutils for HP -UX](http://hpux.connect.org.uk/hppd/hpux/Gnu/)有一個選項嗎? – halfbit

+0

不,不能使用GNU diffutils – 6055

1

這可以通過如下所示的「grep」命令完成。

diff -b -r -w <dir-one>/AFB.csv <dir-two>/AFB.csv | grep ">" >> append.log 
diff -b -r -w <dir-one>/AFB.csv <dir-two>/AFB.csv | grep "<" >> changed.log 
相關問題