Text-Processing
使用 AWK for 循環作為查找和替換的輸入
我有兩個文件:
Ref.txt 包含:
ABCDEFG,15147,ABC,ABCD,ABCDE HIJKLMN,500,HIJKLM,HIJKL,HIJK
和 Seq.txt 包含:
ABCDEFG ABCXXXX ABCDXXX ABCDEXX HIJKXXX HIJKLXX HIJKLMX HIJKLMN
我想在 Seq.txt 文件中搜尋 Ref.txt 文件的每一行的欄位 3-end,並將找到該字元串的行替換為該行第一個欄位中的字元串。我在這個例子中尋找的輸出是這樣的:
ABCDEFG ABCDEFG ABCDEFG ABCDEFG HIJKLMN HIJKLMN HIJKLMN HIJKLMN
雖然這是不正確的程式碼,但我正在考慮這樣的命令:
awk '{for(i=3; i<=NF; i++) gsub( $i , $1)}
但是 for 循環指的是 Ref.txt 文件,而 gsub 命令是在 Seq.txt 文件上執行的。
您可能會考慮這樣做的一種方法是,通過將 Ref.txt 中每行的第 3 端欄位與 連結起來,構造一個正則表達式,並將其保存在以值為
|
鍵的關聯數組中。$1
然後,您可以遍歷每個
$1
Seq.txt 的鍵:awk -F, ' NR==FNR { # construct a single ERE as $3|$4|$5|etc. keyed on $1 for(i=3;i<=NF;i++) r[$1] = r[$1] == "" ? $i : r[$1] "|" $i; next } { # test $1 against each ERE and substitute the first matching key for(k in r) { if ($1 ~ r[k]) { $1 = k; break } } } 1 ' Ref.txt Seq.txt