簡體   English   中英

在awk中將字段拆分為數組,然后在另一個文件中搜索每個術語

[英]split field into array in awk, then search each term in another file

我正在嘗試將特定文件中的字段分解為數組,然后檢查每個術語是否出現在第二個文件中(該文件已經存儲在另一個數組中)。 目標是合並兩個文件中的信息。

第一個file1 (具有要拆分的字段的文件)如下所示:

data1=data2=data3 some more stuff
data4=data1 this are things
data2=data5 more text here
...

雖然file2具有以下結構:

data1 10
data2 20
data3 35
data4 15
data5 60

我想使用=拆分file1的第一個字段,然后在第二個文件中搜索每個拆分的術語,並以以下格式打印所有內容:

output

data1=data2=data3 some more stuff 10
data1=data2=data3 some more stuff 20
data1=data2=data3 some more stuff 35
data4=data1 this are things 15
data4=data1 this are things 10
data2=data5 more text here 20
data2=data5 more text here 60

到目前為止,我已經知道了:

awk 'NR==FNR {
l[$1] = $2; next
} {
la=split($1,a,"=")
for(x=1;x<=la;x++)
  print $0,l[a[$x]]
}' file2 file1 > output

首先(當NR==FNR ),我使用第一個字段作為鍵將file2數據存儲在數組l

然后,我以以下方式解析下一個文件:對於每個記錄,我將= $1用作分隔符,將字段$1拆分為數組la la變量將項數存儲在數組a

對於數組afor循環)中的每個元素,我在數組l尋找相應的鍵並輸出當前的內容+ l值。

但是,由於某種原因,我只能從file1獲取內容(當前的不需要的輸出):

data1=data2=data3 some more stuff 
data1=data2=data3 some more stuff 
data1=data2=data3 some more stuff 
data4=data1 this are things 
data4=data1 this are things 
data2=data5 more text here 
data2=data5 more text here 

關於我的代碼可能有什么問題的任何想法?

非常感謝!

awk解救!

如果令牌是固定長度的,則可以進行模式匹配而無需拆分字段

$ awk 'NR==FNR{a[$1]=$2;next}
              {for(k in a) if($1~k) print $0, a[k]}' file2 file1

data1=data2=data3 some more stuff 10
data1=data2=data3 some more stuff 20
data1=data2=data3 some more stuff 35
data4=data1 this are things 10
data4=data1 this are things 15
data2=data5 more text here 20
data2=data5 more text here 60

我自己找到了答案。 這是變量命名的問題。

這是正確的代碼:

awk 'NR==FNR {
l[$1] = $2; next
} {
la=split($1,a,"=")
for(x=1;x<=la;x++)
  print $0,l[a[x]]
}' file2 file1 > output

該鍵位於打印功能中。 現在print $0,l[a[x]]它讀取print $0,l[a[x]]而不是print $0,l[a[$x]] 循環使用x作為其內部計數器,而不是$x 現在將其更改指向數組l的正確鍵(來自file2 )。

我要離開該職位,因為看起來以前沒有提出過這個問題。 請告訴我您是否認為這沒有用。

謝謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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