我想寫一個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
我想寫一個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
你代碼中有一些錯誤:
忘記if語句關閉:FI
的 「grep $ IA」 必須被解釋爲一個命令,如$(grep的$ IA)或` grep $ ia`
您必須在$(grep $ ia)周圍添加一些字符以避免空字符串比較,比如「:」或其他什麼,不管。
解決方案:
for i in `cat b` ; do if [ :$(grep $i a) != :$i ] ;then echo $i;fi; done
感謝它確實工作.. :-) – 2012-04-02 05:00:44
排序的文件,然後使用comm
。在bash
:
comm -13 <(sort a) <(sort b)
這裏假設你有一個足夠最近bash
(3.2版本在Mac OS X 10.7.3不夠新鮮; 4.1 OK),你的文件是a
和b
。 <(sort a)
是進程替換;它在a
上運行sort
,並且輸出作爲第一個文件發送到comm
;同樣爲<(sort b)
。 comm -13
選項僅抑制第一個文件(1
,又名a
)和兩個文件(3
)中的行,因此只留下2
或b
中的行。
你的命令:
for i in `cat b` ; do if[ (grep $i a) != $i ] then echo $i; done
顯示了一些問題—四個單獨的語法問題:
[
(
echo
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
很好的答案,雖然你不是很明顯地給出了兩個單獨的答案。 – ams 2012-04-01 11:27:01
假設A
和B
是你的文件,它可以通過diff
diff A B | grep '^>' | cut -d ' ' -f 2-
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>
考慮發問這裏拍前通過http://shellcheck.net/運行代碼的習慣。 – 2017-03-07 16:28:10