2011-11-27 95 views
0

我想用awk,sed或類似的方法將來自兩個文件的第二個字段的條目組合起來。根據第一個字段匹配行併合並第二個字段

File0:

string:data:moredata 

文件1:

string:random:moredata 

如果第一場,file0文件1匹配的條目,然後打印

$random:$data 

選擇領域似乎微不足道:

$ awk -F':' '{print $2}' filename 

需要匹配的行和打印匹配列$ 2

回答

2

這個怎麼樣 -

awk -F":" 'NR==FNR {x[$1] = $0; y[$1] = $2; next} ($1 in x) {print $2":"y[$1]}' file1 file2 

執行:

[jaypal~/Temp]$ cat file1 
string:data:moredata 

[jaypal~/Temp]$ cat file2 
string:random:moredata 

[jaypal~/Temp]$ awk -F":" 'NR==FNR {x[$1] = $0; y[$1] = $2; next} ($1 in x) {print $2":"y[$1]}' file1 file2 
random:data 

在這個解決方案中,我們加載文件1的整個記錄​​中在列1索引的數組。我們快速檢查下一個文件以查看列1是否存在。如果是,則執行print語句。

陰性:

[jaypal~/Temp]$ cat file1 
string:data:moredata 
man:woman:child 

[jaypal~/Temp]$ cat file2 
man:random:moredata 
string:woman:child 

[jaypal~/Temp]$ awk -F":" 'NR==FNR {x[$1] = $0; y[$1] = $2; next} ($1 in x) {print $2":"y[$1]}' file1 file2 
random:woman 
woman:data 

只需添加到解釋,NR和FNR是awk的內置變量。 NR給出行號,並且在兩個文件中循環時不會重置爲0。反之,FNR也是一個行號,當第二個文件啓動時,它被重置爲0。因此,這允許我們將文件1存儲到數組中,因爲該動作僅在NR == FNR時完成。一旦這個條件變爲假,這意味着第二個文件已經啓動並且下一個模式動作語句開始執行。

0

join - join lines of two files on a common field

所以做你的awk的事情,只有同時打印數據和「重點」領域。然後做一個加入類似的命令:join -1 1 -2 1 file1 file2 > joined.dat

+0

不知道如何使用剛剛加入,因爲他們有可能不進行排序,進而** ** file0可能有更少的行相匹配的行。 – Astron

+0

我不認爲更少的行很重要。這就像數據庫表,我想。 (我只用過一次'join',這是幾年前的事情。)'man'頁面在分類時不清楚。一部分說你必須排序,另一部分暗示'join'可以爲你排序。我猜,實驗是必需的。 – drysdam

1

sed解決方案可能會爲你工作:

# cat file1 
string0:data1:moredata 
string2:data3:moredata 
string4:data5:moredata 
string6:data7:moredata 
string8:data9:moredata 
# cat file2 
string0:random1:moredata 
string2:random3:moredata 
string4:random5:moredata 
cat file1 - <<<"EOF" file2 | 
sed '1,/^EOF/{H;d};G;s/^\([^:]*:\)\([^:]*:\).*\1\([^:]*\).*/$\2$\3/p;d' 
$random1:$data1 
$random3:$data3 
$random5:$data5 

說明:

串聯文件與EOF分隔符。將第一個文件啜入保存空間(HS)。將HS附加到第二個文件中的所有行中,製作查找表。使用分組和反向引用來替代所需的輸出結果。順便說一句,$$random:$data打算?

此解決方案也可以通過只保留查找和file2的每一行中的必要數據來提高效率。

+0

做得很好!您應該開始在SED單線上撰寫電子書。我還沒有想出G,H和其他瘋狂的東西。 :) +1 –

+0

'$'不是必需的,想要傳達不同的領域。感謝您的反饋。 – Astron

相關問題