我有兩個檔案,FILE1包含很多行,FILE2包含KEY VALUE引數。我需要將FILE2與FILE1進行比較,如果有匹配,FILE1中的相應單詞應該被替換為FILE2中的下一列。
例子:
FILE1:
<SOME YAML代碼
-------------->
PARM1
value: PARM2
帳戶
淘寶網_PARM4
<END OF YAML CODE
---------------->
FILE2:
PARM1 mmddyy
PARM2 hhmmss
PARM3 awsid
PARM4 cc
因此,對于FILE2中的每一個匹配的FILE1,FILE1中的相應單詞應該被替換為FILE2中的第二列。因此,所需的輸出應該是:
<SOME YAML CODE>
-------------->
**mmddyy**
值:**hhmmss**
**awsid**
somyaml_**cc**
<END OF YAML CODE
---------------->
在其他社區的幫助下,我能夠運行下面的命令,但它只在搜索標準在行的開頭時起作用
awk '
NR==FNR{k[$1]=$2; }
NR! =FNR{if($1 ink){$0=k[$1]}。 列印}
' file2 file1
uj5u.com熱心網友回復:
這個awk應該對你的例子資料有效。
$ awk -F"[ :_]" 'NR==FNR {array[$1]=$2; next}。$1~/PARM/{sub(/PARM./,array[$1])}$2~/PARM/{sub(/PARM. /,array[$2])}1'/span> file2 file1
$ cat awk.script
#!/usr/bin/env awk -f
BEGIN {
FS="[ :_]" #設定要使用的分隔符。
} NR==FNR {
array[$1]=$2 #Create array from file2。
next #移動到file1
} $1~/PARM/ { #If column1 matching PARM
sub(/PARM./,array[$1] ) #substitute PARM for content of array。
} $2~/PARM/ { #If column 2 matches PARM
sub(/PARM./,array[$2] ) #substitute PARM for content array。
} 1 #Print
輸出
$ awk -f awk.script file2 file1
<SOME YAML CODE
-------------->
mmddyy
value: hhmmss
awsid
淘寶網
<END OF YAML CODE
---------------->
uj5u.com熱心網友回復:
即使你的PARM值是其他PARM值的子集,或者PARM包含regexp metachars或替換字串,包含反向參考或遞回定義,其中PARM1被映射到PARM2,PARM2又被映射到PARM1,這也會做到你想要的。 如果檔案2定義了一個PARM到另一個的映射,那么這只是以最長的優先順序進行映射。它使用 GNU awk 進行排序,所以我們可以按照最長的順序訪問 PARM,以正確處理子集 - 如果你沒有 GNU awk,那么在 awk 腳本之外對 file2 進行排序。
$ cat tst.awk
BEGIN {
PROCINFO["sorted_in"/span>] = "@val_num_desc"/span>
}
NR==FNR {
map[1] = 2
len[1] = length(1)
next(1)
}
{
for ( old in len ) {
new = map[old]。
head = ""/span>
tail = $0
while ( s=index(tail,old) ) {
head = head substr($0,1, s-1) new
tail = substr(tail,s len[old])
}
$0 = head tail
}
列印。
}
$ awk -f tst.awk file2 file1
<SOME YAML CODE
-------------->
mmddyy
value: hhmmss
awsid
淘寶網
<END OF YAML CODE
---------------->
問題中提供的例子并不好,因為它只涵蓋了最基本的晴天情況,即file2中的所有字串都是唯一的,并且只由字母數字字符組成。一個更好的測驗是在第一個字串中使用regexp元標記,字串是其他字串的子集,并在替換字串中使用反向參考元標記,例如:
$ head file1 file2
==> file1 <==
<Some YAML CODE
-------------->
A.B
value:A.BX
樸樹
詩韻_PARM4
<END OF YAML CODE
---------------->
==> file2 <==
A.B mmddyy
A.BX hhmmss
PARM3 a1b&/span>c
PARM4 cc
$ awk -f tst.awk file2 file1
<SOME YAML CODE
-------------->
mmddyy
value: hhmmss
a1b&/span>c
某個人的名字叫somyaml_cc
<END OF YAML CODE
---------------->
這仍然缺少需要考慮的情況,例如file2包含遞回映射,甚至只是從一個 "PARM "字串到另一個字串的一次性映射:
$ head file1 file2
==>file1 <==
<Some YAML CODE
-------------->
PARM1
value: PARM2
帳戶
淘寶網_PARM4
<END OF YAML CODE
---------------->
==> file2 <==
PARM1 mmddyy
PARM2 hhmmss
PARM3 PARM4
PARM4 PARM3
$ awk -f tst.awk file2 file1
<SOME YAML CODE
-------------->
mmddyy
value: hhmmss
PARM4
淘寶網_PARM4
<END OF YAML CODE
---------------->
但問題中沒有討論這個問題,所以我不知道這是否是預期的輸出,如果不是,預期的輸出是什么,為什么 - 如果你需要以不同的方式處理這個問題或其他非瑣碎的情況,請更新問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/324947.html
標籤:
