2014-02-19 121 views
2

我有兩個文件如下:使用bash陣列中AWK

file1

3 1 
2 4 
2 1 

file2

23 
9 
7 
45 

file1第二字段用於指定的file2線包含要檢索和打印的號碼。在所需的輸出中,打印第一個字段file1,然後打印檢索的字段。

所需的輸出文件:

3 23 
2 45 
2 23 

這是我試圖解決這個問題:

IFS=$'\r\n' baf2=($(cat file2));echo;awk -v av="${baf2[*]}" 'BEGIN {split(av, aaf2,//)}{print $1, aaf2[$2]}' file1;echo;echo ${baf2[*]} 

然而,這個腳本不能使用猛砸陣列baf2

該解決方案必須高效,因爲file1擁有數十億行,file2擁有數百萬行的實際情況。

+0

這可能指向您在正確的方向:http://stackoverflow.com/questions/6022384/bash-tool-to-get-nth-line-from-a-file –

回答

1

可以在陣列中使用此awk

awk 'FNR==NR {a[NR]=$1;next} {print $1,a[$2]}' file2 file1 
3 23 
2 45 
2 23 

Sorte文件2。
然後從file1打印字段1,並使用字段2查找數組。

+0

尊敬的@Jotne,這個解決方案的運行時複雜性是多少'file1'中的行是'm',n 'file2'中的行數是'n'?它不應該是'O(mn)',因爲'm'和'n'非常大。 – Kadir

+0

我不知道需要多長時間,但是你可以輸入'time awk'FNR ...'並查看事情需要多長時間。 – Jotne

+0

親愛的@Jotne,在嘗試您的解決方案後,我意識到我給出的MWE並未顯示我真實數據集的所有屬性。 'file1'的第一個字段可能相同。 – Kadir

1

這具有類似的基礎Jotne的解決方案,但負載file2中首先插入的存儲器(因爲它是小於file1的):

awk 'FNR==NR{x[FNR]=$0;next}{print $1 FS x[$2]}' file2 file1 

說明

的FNR == NR部分意味着在花括號中跟隨的部分僅在讀取file2而不是file1時執行。當讀取file2的每一行時,它將按照當前行號索引保存在數組x []中。第二組花括號中的部分針對file1的每一行執行,並打印行中的第一個字段,後跟字段分隔符(空格),後跟x []中的條目,並由行上的第二個字段進行索引。

1

用awk

1)打印file1中的所有行,無論是否有匹配或不

awk 'NR==FNR{a[NR]=$1;next}{print $1,a[$2]}' file2 file1 

2)打印匹配行只

awk 'NR==FNR{a[NR]=$1;next}$2=a[$2]' file2 file1