2011-12-02 94 views
1

我有一個輸出條目從$ NEWFILE缺席,但在$的oldfile發現了一個awk命令:awk腳本刪除單個記錄,而不只是組記錄

awk -F "|" 'NR==FNR{a[$4]++}!a[$4]' $NEWFILE $OLDFILE > $OUTFILE 

此命令的偉大工程,當實體的所有條目在$ NEWFILE中找不到共享唯一標識符。但是,如果實體中只有一個條目(而不是全部)已從$ NEWFILE中刪除,則它會失敗。

任何人都有關於如何調整awk命令來輸出$ NEWFILE中沒有但在$ OLDFILE中找到的所有條目的建議,無論是否刪除實體的所有條目?

樣本數據:newfileoldfile

+0

根據您的數據,您是否需要關閉第四列或是否可以關閉第一列? – Xailor

回答

0

如果我理解正確的話,這是你要

awk -F "|" 'NR==FNR{a[$1 $2 $3 $4]++}!a[$1 $2 $3 $4]' NEWFILE OLDFILE > OUTFILE 

由於NEWFILE沒有出現在OLDFILE唯一行標識符是四個第一場的複合材料中的網址是什麼。因爲NEWFILE沒有這些網址,所以簡單的diff不會。

+0

就是這樣!我認爲它可能縮短爲:'awk -F「|」 'NR == FNR {a [$ 2 $ 4] ++}![$ 2 $ 4]'NEWFILE OLDFILE> OUTFILE'但是是的,就是這樣!謝謝! – user981023

+0

@ user981023:可能是這樣。不確定對有限的示例數據存在的其餘數據集做出哪些假設。如果它解決了您的問題,請隨時接受答案。 – flesk

+0

嗯,我在想,既然$ 1和$ 3的列總是匹配$ 4,那麼$ 2就是唯一的條目。因此,如果$ 2和$ 4匹配,您可以放心地刪除。那是對的嗎? – user981023

0

AWK是行解釋線那原因只有一個被刪除線和其他地方之中。你可以做兩件事:

  • 如果可以的話,過濾一個表達式,該表達式對於行是通用的。
  • 對於newfile的每一行,運行一個for循環,它將迭代oldfile併爲您執行操作。
2

短而甜:使用diff。您可以將diff oldfile newfile | grep '^< ' | cut -b3-限制爲您想要的輸出。

+0

'diff'不適用於他的情況,因爲'OLDFILE'對於'NEWFILE'沒有的每一行都有一個url字段。你的簡短而甜蜜的命令相當於'cat newfile'。 – flesk

+0

是的,差異很好。 – Xailor

+0

所以我們可能想先刪除它,按照'sed oldfile -e's/| [^ |] * $ //'| diff - newfile | grep'^ <'| cut -b3 -' –

0

必須使用awk?我們可以簡單地僱用join,這真的是你在這裏做的,不是嗎?

$join -v2 -t'|' -j4 <(sort -t'|' -k4 newfile) <(sort -t'|' -k4 oldfile) |tee outfile 
P-1-01541|22|Professor|University of Alabama at Birmingham|http://www.uab.edu/ 
P-1-01541|22|Short-Term Scholar|University of Alabama at Birmingham|http://www.uab.edu/ 

當然,這是假設你要加入的第4列,像最基本的加入,你不希望再次重申,必須先進行排序。