我最近一直在嘗試在 awk 中執行以下操作 - 我們有兩個檔案(F1.txt F2.txt.gz)。從第二個流式傳輸時,我想用其子字串替換 f1.txt 中所有出現的條目。我來到了這一點:
zcat F2.txt.gz |
awk 'NR==FNR {a[$1]; next}
{for (i in a)
$0=gsub(i, substr(i, 0, 2), $0) #this does not work of course
}
{print $0}
' F1.txt -
想知道如何在 Awk 中正確執行此操作。謝謝!
uj5u.com熱心網友回復:
如果錯誤,請更正假設。
您有兩個檔案,一個包含一組條目。如果第二個檔案有這些單詞中的任何一個,請將它們替換為前兩個字符。
例子:
==> file1 <==
Azerbaijan
Belarus
Canada
==> file2 <==
Caspian sea is in Azerbaijan
Belarus is in Europe
Canada is in metric system.
$ awk 'NR==FNR {a[$1]; next}
{for(i=1;i<=NF;i )
if($i in a) $i=substr($i,1,2)}1' file1 file2
Caspian sea is in Az
Be is in Europe
Ca is in metric system.
請注意,子字串索引以 1 in 開頭awk。
uj5u.com熱心網友回復:
嘗試改變
$0=gsub(i, substr(i, 0, 2), $0)
進入
gsub(i, substr(i, 0, 2))
gsub() 函式的回傳值是替換成功的次數,而不是替換后的字串。
uj5u.com熱心網友回復:
$0=gsub(i, substr(i, 0, 2), $0) #this does not work of course
GNU AWK 的函式gsub確實改變了第三個引數的值(因此它必須是可分配的)并回傳所做的替換次數。如果您只想更改值,則不應該關心回傳值。考慮以下簡單示例,讓file1.txt內容為
a x
b y
c z
和file2.txt內容是
quick fox jumped over lazy dog
然后
awk 'FNR==NR{arr[$1]=$2;next}{for(i in arr){gsub(i,arr[i],$0)};print}' file1.txt file2.txt
給出輸出
quizk fox jumped over lxzy dog
請注意,如果您的替換件中有任何鏈條
a b
b c
然后輸出依賴于陣列遍歷順序。
(在 gawk 4.2.1 中測驗)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/519925.html
標籤:linuxawkgsub
