[英]Comparing two csv files and updating a field according to the comparison using awk
[英]Comparing two files field by field in Linux
我試圖比較兩個文件(用逗號和空格分隔)使用3個字段(字段1,2,5從file1和1,2,5從file2)如果兩個文件匹配我想要file2的整個記錄連接到最后使用awk提交的file1。 例如file1:
1, 4, abebe, kebede, 25, 101, 42
1, 4, abebe, debebe, 42, 201, 47
1, 4, abebech, kebede, 17, 33, 57
文件2:
1, 4, abebe, kebede, 25, 101, 42
1, 4, Tesse, debo, 25, 101, 42
1, 4, derartu, tulu, 25, 101, 42
輸出:
42, 1, 4, abebe, kebede, 25, 101, 42
47, 1, 4, Tesse, debo, 25, 101, 42
57, 1, 4, derartu, tulu, 25, 101, 42
我是linux的新手....任何幫助都是適用的
我對問題的第一次閱讀有助於這個解決方案:
awk '{getline t < "file2"; split( t, a );
if( a[1]a[2]a[5] == $1$2$5) print $NF",", t}' file1
但似乎問題實際上是:'給定file1
,其中我們知道任何記錄,其中字段1,2和4是相同的,最后的字段也是相同的,找到file2
所有行與相應的字段1,2和4,並輸出該行與file1
的最后一個字段前置。 在這種情況下,丹尼斯給出的解決方案是有效的。
由於文件1中記錄1的字段1,2和5與文件2中的所有記錄匹配,因此我以相反的順序將文件列為參數,以獲得所需的輸出。
awk 'BEGIN {OFS = ", "} NR == FNR {a[$1, $2, $5] = $NF; next} $1 SUBSEP $2 SUBSEP $5 in a {print a[$1, $2, $5], $0}' file2 file1
NR == FNR
塊形成一個循環,該循環將參數列表中首先出現的文件讀入數組。 當記錄號( NR
)和文件記錄號( FNR
)不再相等時,處理繼續到命名為第二個參數的文件。
在那里,檢查數組以查看兩個文件中的字段是否匹配。 如果是,則輸出相應的保存字段和當前記錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.