Linux Awk脚本根据特定模式查找字符串并查找其对应的行,然后构建另一个输出文件

Linux Awk脚本根据特定模式查找字符串并查找其对应的行,然后构建另一个输出文件,linux,shell,awk,scripting,Linux,Shell,Awk,Scripting,专家, 需要您对此awk脚本的支持。 我们只有一个输入文件,所有这些第1列和第2列都在同一个文件中,必须在一个文件(第1列和第2列)中查找值,但我们需要在另一个文件中进行输出 需要grep第1列中字符串包含9K的行,然后grep第2列中对应的行。假设检查9K1,然后grep A1,如果没有,则检查第1列中的A1,输出结果如下面的预期输出文件所示 然后再次检查9K1,grep A2,在第1列中查找A2,如果找到grep,则查找其对应的行值B2。 现在检查第1列中的B2值,然后grep检查C2而不是

专家,
需要您对此awk脚本的支持。 我们只有一个输入文件,所有这些第1列和第2列都在同一个文件中,必须在一个文件(第1列和第2列)中查找值,但我们需要在另一个文件中进行输出
需要grep第1列中字符串包含9K的行,然后grep第2列中对应的行。假设检查9K1,然后grep A1,如果没有,则检查第1列中的A1,输出结果如下面的预期输出文件所示
然后再次检查9K1,grep A2,在第1列中查找A2,如果找到grep,则查找其对应的行值B2。
现在检查第1列中的B2值,然后grep检查C2而不是A2,正如我们之前在查找中已经考虑的那样。 现在在列中查找C2,并用grep D2代替B2

需要检查列1中包含9K的所有行,因为列1中可能有值为9K2、9K3、9K4的行,而列2中可能有相应的数据

输入文件:

9K1,A1
9K1,A2
9K1,A3
9K1,A4 
9K1,A5 
A2,B2
B2,A2
B2,C2
C2,B2
C2,D2
A5,B5
B5,C5
B5,A5
9K1,A6
A6,B6
B6,A6
B6,C6
以下是所需的预期输出(另一个文件):

使用的代码:

awk '
NR==FNR{
    assoc[$1]=$2
    next
}
(FNR!=1)&&($1~/9K/){
    printf "%s,%s", $1,$2
    seen[$1]; seen[$2]
    search=$2
    while((search in assoc) && !(assoc[search] in seen)){
        search=assoc[search]
        printf ",%s", search
        seen[search]
    }
    print ""
    for(var in seen){
         delete seen[var]
    }
}' input.csv input.csv > output.csv
上述代码返回的输出:(不符合预期)

请尝试以下代码:

awk '
NR==FNR{
    assoc[$1]=$2
    next
}
(FNR!=1)&&($1~/9K/){         
    printf "%s,%s", $1,$2
    seen[$1]; seen[$2]
    search=$2 
    while((search in assoc) && !(assoc[search] in seen)){
        search=assoc[search]
        printf ",%s", search
        seen[search]
    }
    print ""
    for(var in seen){ 
         delete seen[var]
    }
}' inputfile.csv inputfile.csv > output.csv
给出:

BGL_0BC_901_1AG_A_CASR9KTR176,BGL_KMR_919_1AC_B_CASR920R899
BGL_0BC_901_1AG_A_CASR9KTR176,BGL_CHT_903_1AC_B_CASR920R879,BGL_BAM_910_1AC_B_CASR920R879,BGL_BAM_912_2AC_B_CASR920R879,BGL_BAM_912_1AC_B_CASR920R879
BGL_0BC_901_1AG_A_CASR9KTR176,BGL_0UT_901_1AC_CASR903R551
BGL_0BC_901_1AG_A_CASR9KTR176,BGL_YOT_919_1AC_CASR903R458
BGL_0BC_901_1AG_A_CASR9KTR176,BGL_0BC_901_1AC_T_CASR920R504
BGL_2BC_901_1AG_A_CASR9KTR124,BGL_BGM_908_1AC_CASR903R173
BGL_2BC_901_1AG_A_CASR9KTR124,BGL_ABT_932_1AC_CASR903R963
BGL_2BC_901_1AG_A_CASR9KTR124,BGL_2BC_901_1AC_T_CASR920R948
BGL_2BC_901_1AG_A_CASR9KTR124,BGL_2BC_901_1AC_T_CASR920R948
BGL_2BC_901_1AG_A_CASR9KTR124,BGL_ABT_918_1AC_CASR903R963
关于


这里有点不清楚。第1列上有重复项。 让我们以第8行为例。BGL_BAM_910_1AC_B_CASR920R879具有价值 BGL_BAM_912_2AC_B_CASR920R879,第2列。搜索值 第1列中的BGL_BAM_912_2AC_B_CASR920R879为我们提供了两行(第9行) 和10)在第2列上具有不同的值。我们该选哪一个

我选取了与column1中column2的值匹配的最后一行。如果需要,我可以修改代码

你能告诉我这个项目的预期产出吗:

9K1,A1
9K1,A2
A2,B1
A2,B2
A3,C1
A3,C2
9K2,A2
9K2,A3
9K2,A3
9K2,A3
9K2,C1
C1,D1
C2,D2

NR==FNR
通常在有多个文件输入时使用。只有一个文件
NR
将始终等于
FNR
和true,因此不需要。这里有一些不清楚的地方。第1列上有重复项。让我们以第8行为例<代码>BGL_BAM_910_1AC_B_CASR920R879在第2列有值
BGL_BAM_912_2AC_B_CASR920R879
。在第1列中搜索值
BGL_BAM_912_2AC_B_CASR920R879
将得到第2列上具有不同值的两行(第9行和第10行)。我们应该选哪一个?那么我有不同的问题:第二行:为什么
9K1,A2,B1
而不是
9K1,A2,B2
?第三行,为什么
9K2,A2
而不是
9K2,A2,B1
9K2,A2,B2
?第四行,为什么<代码> 9K2,A3而不是<代码> 9K2,A3,C1,D1 < /代码>?你能尽可能简单地清楚地解释你想要的输出是如何从那个输入中得到的吗?我们必须考虑行数10的值。因为第9行,我们已经从第6行从第2行中挑选出来,并且已经在列1中检查了它的存在。所有的情况都需要考虑。Corentin Limier。我们只有一个输入文件,所有这些列1和列2都在同一个文件中,并且必须在一个文件(CulnN1和Culn2)中查找值,但是我们需要在另一个文件中输出。@ AS6566,我知道只有一个文件,我解析两次相同的文件,因为在您的情况下更容易。为了清晰起见,我进行了编辑。我仍然不清楚您的规则,如果这两个值已经在前面的行中选取了呢?如果这两个值以前从未拾取过呢?哪一个有优先级?代码没有得到正确的输出…基本上每行的开头我需要字符串值,其中有9K,后面跟着其他字符串。。如果已经选择了这两个值,我相信这意味着我们的代码已经对其进行了处理,并检查了第2列中相应的行值。。如果这个值从来没有被选过,那么我们必须考虑它,并且必须在第2列中处理并寻找它的相应值。希望这次我能够清除您的查询。如果没有,请告诉我我编辑并添加了
9K
过滤器。我仍然不明白你的优先顺序,所以我创建了一个例子,请用它编辑你的问题,并给我预期的输出。
BGL_0BC_901_1AG_A_CASR9KTR176,BGL_KMR_919_1AC_B_CASR920R899
BGL_0BC_901_1AG_A_CASR9KTR176,BGL_CHT_903_1AC_B_CASR920R879,BGL_BAM_910_1AC_B_CASR920R879,BGL_BAM_912_2AC_B_CASR920R879,BGL_BAM_912_1AC_B_CASR920R879
BGL_0BC_901_1AG_A_CASR9KTR176,BGL_0UT_901_1AC_CASR903R551
BGL_0BC_901_1AG_A_CASR9KTR176,BGL_YOT_919_1AC_CASR903R458
BGL_0BC_901_1AG_A_CASR9KTR176,BGL_0BC_901_1AC_T_CASR920R504
BGL_2BC_901_1AG_A_CASR9KTR124,BGL_BGM_908_1AC_CASR903R173
BGL_2BC_901_1AG_A_CASR9KTR124,BGL_ABT_932_1AC_CASR903R963
BGL_2BC_901_1AG_A_CASR9KTR124,BGL_2BC_901_1AC_T_CASR920R948
BGL_2BC_901_1AG_A_CASR9KTR124,BGL_2BC_901_1AC_T_CASR920R948
BGL_2BC_901_1AG_A_CASR9KTR124,BGL_ABT_918_1AC_CASR903R963
9K1,A1
9K1,A2
A2,B1
A2,B2
A3,C1
A3,C2
9K2,A2
9K2,A3
9K2,A3
9K2,A3
9K2,C1
C1,D1
C2,D2