我有兩個檔案,我需要一個輸出檔案,其中包含不在第一個檔案中但在第二個檔案中的所有內容,第二個檔案包含第一個檔案中的所有內容以及更多條目。我試過:
for j in `cat first`; do sed '/"$j"/d' second; done
cat first
a
b
c
d
e
f
# cat second
a
1
b
22
33
c
44
d
11
e
44
f
uj5u.com熱心網友回復:
將我的評論轉換為答案,以便將來的訪問者輕松找到該解決方案。
你可以使用這個grep:
grep -vFxf first second
1
22
33
44
11
選項是:
-v:選定的行是那些不匹配任何指定模式的行-F:固定字串搜索-x: 完全符合-f:為模式使用檔案
uj5u.com熱心網友回復:
我更喜歡@anubhava 的答案,它非常適合撰寫腳本。但是,如果您只是想通過視覺輔助來查看兩個檔案之間的差異,那么舊的 diff 命令可能會很有幫助。
$ diff -y first second
a a
> 1
b b
> 22
> 33
c c
> 44
d d
> 11
e e
> 44
f f
-y 或 --side-by-side,分兩列輸出。
我也看過這個很棒的(完全歸功于@Kent):
$ awk 'NR==FNR{a[$1] ;next;}!($0 in a)' first second
1
22
33
44
11
44
還有更多這樣的命令:
- colordiff - 類似 diff 但有顏色
- cmp - 按位元組比較檔案
- vimdiff - 使用 vim 編輯器的差異
可能還有很多其他很棒的方法可以做到這一點,這些只是其中的一些方法。
uj5u.com熱心網友回復:
@anubhava 的評論是一個很好的答案。
使用 comm,先忽略獨有的,忽略常見的
comm --nocheck-order -13 first second
有一個直截了當awk解決方案。
uj5u.com熱心網友回復:
更新 1:超截斷版
mawk ' NR==FNR { __[$_] } NF -= $_ in __' FS='^$'
test_first_file.txt
test_second_file.txt
1
22
33
44
11
44
—————————————————————————————————
[m/n/g]awk '
BEGIN { FS="^$" } NR==1 {
do { __[$-_] } while ((getline)<=(FNR==NR))
} ($-_ in __)!=!___[$-_]-- ' test_first_file.txt test_second_file.txt
—————————————————————————————————
1
22
33
44
11
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/476675.html
