2015-11-23 42 views
0

我在Linux服務器中有兩個diff目錄,其中來自兩個diff服務器的.csv文件不斷出現。兩個目錄中的文件的文件名是相同的。 我想要一個bash/awk腳本,它從兩個文件夾中選取一組相同的文件並讀取它們中的內容。 如果兩個文件中的所有記錄都是相同的,它應該繼續下一組文件,否則如果任何記錄有差異,它應該只將該記錄重定向到另一個文件名稱$ filename_diff。 我的bash和awk的一個新的學習和大量的嘗試後,我才能夠使下面的代碼這是不是運行在所有:(bash/awk腳本比較兩個不同文件夾中的所有文件的內容

#!/bin/bash 

for file1 in $(ls -rlt /var/opt/dir1/*.csv | awk '{ print $9 }') 
do 
for file2 in $(ls -lrt /var/opt/dir2/*.csv |awk '{ print $9 }') 
do 
if [["$file1" = "$file2"]] 
then 
awk 'BEGIN {FS==","} NR == FNR{arr[$0];next} ! ($0 in arr)' $file1 $file2 > /var/opt/diff/`echo "$file2"_diff` 
else 
echo "To NULL" > /dev/null 
fi 
done 
done 

提供了一個解決這個請大家幫忙。 非常感謝你提前

+1

在一些地方錯了。在/var/opt/dir1/*.csv中的第一個for循環中使用簡單的glob擴展for file1;做...完成「。如果它們具有相同的基本名稱,則只比較文件,因此根據第一個文件:file2 =/var/opt/dir2/$(basename「$ file1」)來構建第二個文件名。你用'[[''使用'==',而不是'='(''''用'/ bin/[')'來比較兩個字符串。並且你想確保'$ file2'存在:'if [[-e「$ file2」]];'你不用'/ usr/bin/diff'來比較內容嗎? –

+2

你真的想達到什麼目的? (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)如果你想比較兩個目錄的內容,爲什麼'diff --recursive dir1 dir2'不夠? –

+0

嗨Micha,謝謝你的回覆......我不能使用diff,因爲儘管它會顯示不同的文件,但不會告訴哪個特定的記錄在該文件中不同(因爲我在一個文件中有數千條記錄),也是不同記錄的重定向是一個挑戰... 嘿init_js,謝謝你的回覆以及...請讓我檢查和制定你的建議腳本。我會盡快回復您。 – user5419230

回答

0

我會做這樣的事情:

#!/bin/sh 
for file1 in /var/opt/dir1/*.csv 
do 
    name1=$(basename "$file1") 
    file2="/var/opt/dir2/$name1" 
    [ -f "$file2" ] || continue 
    cmp -s "$file1" "$file2" && continue 
    diff "$file1" "$file2" | sed -e '/^[^>]/d' -e 's/^> //' >/var/opt/diff/"${name1}_diff` 
done 

也就是說,

  • 不要使用「LS」獲得的文件名列表
  • 只需要一個循環
  • diff程序(如在評論中所指出)給由它的默認輸出選擇「>」線所需要的信息。
  • 爲輸出文件名給出的路徑名看起來不正確(我刪除了不需要的目錄部分)。
0

@init_js: - 您推薦的更改適合我。下面是工作腳本,

#!/bin/bash 

for file1 in /var/opt/dir1/*.csv 
do 
file2=/var/opt/dir2/$(basename "$file1") 
if [[ -e "$file2" ]] 
then 
awk 'BEGIN {FS==","} NR == FNR{arr[$0];next} ! ($0 in arr)' $file1 $file2 > /var/opt/diff/`echo $(basename "$file1")_diff` 
fi 
done 

我不明白一兩件事,爲什麼 「文件2」 變量沒有被宣佈爲文件2 = $(在/ var /選擇/ DIR2/$(名前綴 「$文件1」));因爲通常我們只用$(command)聲明變量,不是嗎?

相關問題