Text-Processing

使用 AWK for 循環作為查找和替換的輸入

  • August 15, 2019

我有兩個文件:

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

然後,您可以遍歷每個$1Seq.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

引用自:https://unix.stackexchange.com/questions/535456