[英]Using Bash array in AWK
我有兩個文件,如下所示:
file1
:
3 1
2 4
2 1
file2
:
23
9
7
45
file1
的第二個字段用於指定file2
的行,其中包含要檢索和打印的數字。 在所需的輸出中,將打印file1
1的第一個字段,然后打印檢索到的字段。
所需的輸出文件:
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[*]}
但是,此腳本不能使用Bash數組baf2
。
該解決方案必須高效,因為在實際情況下file1
有數十億行, file2
有數百萬行。
你可以使用這個awk
awk 'FNR==NR {a[NR]=$1;next} {print $1,a[$2]}' file2 file1
3 23
2 45
2 23
對數組a中的file2進行排序。
然后從文件1
打印字段1
,並使用字段2
在數組中查找。
這與Jotne的解決方案具有相似的基礎,但是首先將file2加載到內存中(因為它小於file1):
awk 'FNR==NR{x[FNR]=$0;next}{print $1 FS x[$2]}' file2 file1
說明
FNR == NR部分意味着僅在讀取file2而不是file1時才執行大括號后面的部分。 讀取file2的每一行時,它將被保存在數組x []中,並由當前行號索引。 對文件1的每一行執行第二組花括號中的部分,並在該行上打印第一個字段,然后打印字段分隔符(空格),然后在x []中輸入該行的第二個字段索引的條目。
使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.