[英]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
。
對於數組a
( for
循環)中的每個元素,我在數組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.