[ad_1]
専門家、
この 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
[ad_2]
コメント