2012-04-01 116 views
0

我想寫一個shell腳本來模擬以下問題:分配的shell腳本變量

文件中包含像

a 
b 
c 

和文件B的某些條目包含

a 
g 
d 
t 
q 
c 

最終文件應該有
(文件b中的內容不在文件a中)

g 
d 
t 
q 

我是想這樣的事情,但它不工作:

for i in `cat b` ; do if[ (grep $i a) != $i ] then echo $i; done 
+0

考慮發問這裏拍前通過http://shellcheck.net/運行代碼的習慣。 – 2017-03-07 16:28:10

回答

2

你代碼中有一些錯誤:

  1. 忘記if語句關閉:FI

  2. 的 「grep $ IA」 必須被解釋爲一個命令,如$(grep的$ IA)或` grep $ ia`

  3. 您必須在$(grep $ ia)周圍添加一些字符以避免空字符串比較,比如「:」或其他什麼,不管。

解決方案:

for i in `cat b` ; do if [ :$(grep $i a) != :$i ] ;then echo $i;fi; done 
+0

感謝它確實工作.. :-) – 2012-04-02 05:00:44

2

排序的文件,然後使用comm。在bash

comm -13 <(sort a) <(sort b) 

這裏假設你有一個足夠最近bash(3.2版本在Mac OS X 10.7.3不夠新鮮; 4.1 OK),你的文件是ab<(sort a)是進程替換;它在a上運行sort,並且輸出作爲第一個文件發送到comm;同樣爲<(sort b)comm -13選項僅抑制第一個文件(1,又名a)和兩個文件(3)中的行,因此只留下2b中的行。

你的命令:

for i in `cat b` ; do if[ (grep $i a) != $i ] then echo $i; done 

顯示了一些問題—四個單獨的語法問題:

  1. 空間之前[
  2. 美元,比(
  3. 分號之前echo
  4. fi;done

修復它們給出:

for i in `cat b`; do if [ $(grep $i a) != $i ]; then echo $i; fi; done 

您還可以使用:

for i in `cat b` 
do 
    if grep $i a > /dev/null 
    then : in both files 
    else echo $i 
    fi 
done 
+0

很好的答案,雖然你不是很明顯地給出了兩個單獨的答案。 – ams 2012-04-01 11:27:01

1

假設AB是你的文件,它可以通過diff

完成
diff A B | grep '^>' | cut -d ' ' -f 2- 
0
pearl.260> cat file3 
i 
a 
b 
c 
pearl.261> cat file4 
a 
g 
d 
t 
q 
c 
pearl.262> nawk 'FNR==NR{a[$1];next}!($1 in a)' file3 file4 
g 
d 
t 
q 
pearl.263>