2014-03-31 97 views
1
1.txt 
1|2|3 
4|5|6 
7|3|6 

2.txt (double pipe) 
1||2||3 
4||5||6 

expected 
7|3|6 

我想比較1.txt和2.txt並打印差異。請注意,每列的列數可能會有所不同AWK:比較具有不同分隔符的文件的差異

awk -F"|" 'NR==FNR{a[$0]++;next} !(a[$0])' 2.txt 1.txt 

如何修改代碼以在每個文件中包含分隔符。

下面的代碼工作的第一場單獨但是我不知道用雙管如何分離等領域

awk -F"|" 'NR==FNR{a[$1]++;next} !(a[$1])' 2.txt 1.txt 

回答

1

一個簡單的解決方法是將擠壓雙分隔符在餵奶前第二個文件到awk

awk -F"|" 'NR==FNR{a[$0]++;next} !(a[$0])' <(tr -s '|' < 2.txt) 1.txt 

爲您的樣品輸入,它會產生:

7|3|6 

編輯:你斷言

awk -F"|" 'NR==FNR{a[$1]++;next} !(a[$1])' 2.txt 1.txt 

作品。它不符合你的期望。它僅比較第一個字段,而不是整行。

+0

謝謝,但我認爲awk中會有一些規定來處理不同的分隔符。但是,代碼(帶$ 1)awk -F「|」 'NR == FNR {a [$ 1] ++; next}!(a [$ 1])'2.txt 1.txt工作。 – Awknewbie

+0

@Awknewbie您認爲_works_實際上只比較第一個字段,而不是整個行的變體。這是錯誤的! – devnull

+0

明白了..謝謝 – Awknewbie

0

我通常使用bash功能來實現這一點:

diff 1.txt <(sed 's/||/|/g' < 2.txt) 
1

您可以使用此awk

awk -F"|" 'NR==FNR{gsub(/\|\|/,"|",$0);a[$0]++;next} !(a[$0])' 2.txt 1.txt 
0

您可以使用正則表達式作爲GAWK分隔符,像這樣,如果你不請記住,如果輸出未排序(如awk中的數組),您可以使用單個命令完成:

gawk 'BEGIN {FS="\\|\\|*"} {gsub(FS,"|") ; a[$0]++} END {for (k in a) {if (a[k] > 0) { print k } } }' 
  1. BEGIN {FS="\\|\\|*"} ==>字段分隔符是一個或多個|
  2. {gsub(FS,"|") ; a[$0]++} ==>在每一行正常化隔板| S的數量爲一,存儲在a N陣列的線,或者如果它是已經在a rray,增加與其相關的值
  3. END {for (k in a) {if (a[k] > 0) { print k } } }終於打印每a rray元素,它發現不止一次。