【解決方法】パターンに基づいて文字列を検索し、列内の対応する行を検索する AWK スクリプト


専門家、
この awk スクリプトのサポートが必要です。 入力ファイルは 1 つしかありません。これらの列 1 と列 2 はすべて同じファイルにあり、1 つのファイル (列 1 と列 2) で値を検索する必要がありますが、出力は別のファイルで必要です。
文字列の列 1 に 9K を含む行を grep し、列 2 の対応する行を grep する必要があります。9K1 をチェックしてから A1 を grep し、列 1 の A1 をチェックしない場合は、以下の予想される出力ファイルに示すような結果を出力します。
次に、再度 9K1 をチェックし、A2 を検索し、列 1 で A2 を探します。見つかった場合は、対応する行の値 B2 を検索します。
ここで、列 1 の B2 値を確認し、ルックアップで以前に考慮したように、A2 の代わりに C2 を grep します。 次に、列で C2 を探し、B2 の代わりに D2 を grep します

列 1 に値 9K2、9K3、9K4 の行があり、対応するデータが列 2 にある可能性があるため、9K を含む列 1 のすべての行をチェックする必要があります。

入力ファイル :

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

以下は、必要な出力と予想される出力です(別のファイル):

9K1,A1
9K1,A2,B2,C2,D2
9K1,A3
9K1,A4
9K1,A5,B5,C5
9K1,A6,B6,C6

上記のコードによって返される出力: (これは期待どおりではありません)

9K1,A3
9K1,A4
9K1,A5
9K1,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

解決策 2

/^9K/ {
        kees[$0];
        next;
}
{
        for ( key in kees )
        {
                #
                # is it part of the key ...
                #
                if ( match( key, $1) )
                {
                        if( match( kees[key],$2) == 0 )
                                kees[key]=kees[key]"," $2
                        break;
                }
                else if ( match( key, $2 ) )
                {
                        if( match( kees[key],$1 ) == 0 )
                                kees[key]=kees[key]"," $1
                        break;
                }

                #
                # not part of the key but a member
                #
                if ( match( kees[key], $1 ) )
                {
                        if( match( kees[key],$2) == 0 )
                                kees[key]=kees[key]"," $2
                }
                else if ( match( kees[key], $2 ) )
                {
                        if( match( kees[key],$1) == 0 )
                                kees[key]=kees[key]"," $1
                }

        }
}
END{
        for ( key in kees )
                print key kees[key]
}

あなたの入力を考えると、非常に大雑把な仕事ですが、
(注意: テスト/チェックする必要があります … これはさらに減らすことができます。それはあなたに任せます。

awk -f s1.awk FS=',' input.csv
9K1,A1
9K1,A2,B2,C2,D2
9K1,A3
9K1,A4
9K1,A5,B5,C5
9K1,A6,B6,C6

コメント

タイトルとURLをコピーしました