簡體   English   中英

在AWK中使用Bash數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM