Regex 通过模式匹配从上一行和下一行提取列

Regex 通过模式匹配从上一行和下一行提取列,regex,awk,Regex,Awk,我有以下文件:extract_info.txt ABC PNG CHNS 到_extractfrom.txt,我需要从中检索信息: ABC 123 234 TCHSL NBV 234 23764 DHG CHNS 123 347 CGJKS CVS 233 4747 JSHGD PNG 122 324 HGH SJDH 373 3487 JHG 我正在运行以下代码 while read line do gene=$(echo $line | awk -F'

我有以下文件:extract_info.txt

 ABC
 PNG
 CHNS
到_extractfrom.txt,我需要从中检索信息:

 ABC  123 234 TCHSL
 NBV  234 23764 DHG
 CHNS 123 347 CGJKS
 CVS  233 4747 JSHGD
 PNG  122 324 HGH
 SJDH 373 3487 JHG
我正在运行以下代码

 while read line
 do
  gene=$(echo $line | awk -F' ' '{print $1}')
  app1=$(awk -v comp1="$gene" '(comp1==$1) {print $1 }' to_extractfrom.txt)
 done < extract_info.txt
如果输出的顺序必须与extract_info文件的顺序相同,并且使用GNU awk,则可以这样做

gawk '
    BEGIN         {prev = "-"}
    NR == FNR     {extract[$1] = FNR; next}
    is_match      {output[m1] = $1 FS m1 FS m2; is_match = 0}
    $1 in extract {is_match = 1; m1 = $1; m2 = prev}
    {prev = $1}
    END {
        PROCINFO["sorted_in"] = "@val_num_asc"
        for (key in extract) print output[key]
    }
' extract_info.txt to_extractfrom.txt 
如果输出的顺序必须与extract_info文件的顺序相同,并且使用GNU awk,则可以这样做

gawk '
    BEGIN         {prev = "-"}
    NR == FNR     {extract[$1] = FNR; next}
    is_match      {output[m1] = $1 FS m1 FS m2; is_match = 0}
    $1 in extract {is_match = 1; m1 = $1; m2 = prev}
    {prev = $1}
    END {
        PROCINFO["sorted_in"] = "@val_num_asc"
        for (key in extract) print output[key]
    }
' extract_info.txt to_extractfrom.txt 
如果输出的顺序必须与extract_info文件的顺序相同,并且使用GNU awk,则可以这样做

gawk '
    BEGIN         {prev = "-"}
    NR == FNR     {extract[$1] = FNR; next}
    is_match      {output[m1] = $1 FS m1 FS m2; is_match = 0}
    $1 in extract {is_match = 1; m1 = $1; m2 = prev}
    {prev = $1}
    END {
        PROCINFO["sorted_in"] = "@val_num_asc"
        for (key in extract) print output[key]
    }
' extract_info.txt to_extractfrom.txt 
如果输出的顺序必须与extract_info文件的顺序相同,并且使用GNU awk,则可以这样做

gawk '
    BEGIN         {prev = "-"}
    NR == FNR     {extract[$1] = FNR; next}
    is_match      {output[m1] = $1 FS m1 FS m2; is_match = 0}
    $1 in extract {is_match = 1; m1 = $1; m2 = prev}
    {prev = $1}
    END {
        PROCINFO["sorted_in"] = "@val_num_asc"
        for (key in extract) print output[key]
    }
' extract_info.txt to_extractfrom.txt 

你能破解这个密码吗?因为我有另一个文件,我需要在模式匹配之前和之后从第4列提取信息,我可以重复使用相同的代码。哈哈,对不起,Jackman先生,我的意思是你可以提供一步一步的解释,以便我可以重复使用此代码吗?FNR=NR将比较两个文件中的行,我们将需要的列存储在一个数组中,它是一个名为extract的数组,我们存储第1列中的所有值,是一个标志吗?进一步进入下一个条件。你能破解这个密码吗?因为我有另一个文件,我需要在模式匹配之前和之后从第4列提取信息,我可以重复使用相同的代码。哈哈,对不起,Jackman先生,我的意思是你可以提供一步一步的解释,以便我可以重复使用此代码吗?FNR=NR将比较两个文件中的行,我们将需要的列存储在一个数组中,它是一个名为extract的数组,我们存储第1列中的所有值,是一个标志吗?进一步进入下一个条件。你能破解这个密码吗?因为我有另一个文件,我需要在模式匹配之前和之后从第4列提取信息,我可以重复使用相同的代码。哈哈,对不起,Jackman先生,我的意思是你可以提供一步一步的解释,以便我可以重复使用此代码吗?FNR=NR将比较两个文件中的行,我们将需要的列存储在一个数组中,它是一个名为extract的数组,我们存储第1列中的所有值,是一个标志吗?进一步进入下一个条件。你能破解这个密码吗?因为我有另一个文件,我需要在模式匹配之前和之后从第4列提取信息,我可以重复使用相同的代码。哈哈,对不起,Jackman先生,我的意思是你可以提供一步一步的解释,以便我可以重复使用此代码吗?FNR=NR将比较两个文件中的行,我们将需要的列存储在一个数组中,它是一个名为extract的数组,我们存储第1列中的所有值,是一个标志吗?进一步进入下一个状态。
NBV ABC -
SJDH PNG CVS
CVS CHNS NBV