3つのファイルがあり、各ファイルには一意の数の列があり、すべての列はタブで区切られていますが、一部の列は3つのファイル間で共有されます。これは、一種の「集約」ファイルを生成するために使用したい3つのファイル間の共有列です。
下の画像はファイルの例を示しています。デフォルトでは、MAIN1とMAIN2列の間のファイルを一致させたいと思います。両方の列は3つのファイル間で一致する必要があります。
2つのファイルの間にMAIN1とMAIN2が一致する場合は、file2の "minor8"列をfile1のテーブルの右側に追加したいと思います。その後、MAIN1とMAIN2が2つのファイル間で一致する場合は、file3の "minor9"をfile1テーブルの右側に追加しようとします。 "minor8"はfile1の一番右の列(列名: "minor3")の横にある必要があるため、新しい出力ファイルでは "minor9"が "minor8"の横にあることを望みます。 OUTPUTファイルは、理想的な最終ファイルがどのように見えるべきかについてのアイデアを提供します(このサンプルOUTPUTには少し矛盾がありますが)。
私は一度に1つのファイルを実行するためにいくつかのawkコマンドを試しましたが、現在はawkについて少し知っています。
私は同様のことを試しました:
awk 'NR==FNR{a[$1$3]++;next} $1$3 in a {$1$3==$2$3 FS a[$1$3]; print}' file1 file2 > OUTPUT
しかし、間違いなく効果はありませんでした。おそらく、多くのコンテンツが欠落しているか、間違いなく間違っている可能性があります。
この行はまだ file3 を考慮していません。
誰もがfile1、file2、およびfile3を使用してOUTPUTファイルを取得する方法を提案できると思います。あなたのアドバイスを活用してください。 1つのステップで3つのファイルを1つの出力ファイルにマージするのが難しい場合(確かにどうすればいいのかわかりません)、一度に1つのファイルに対してこれを行う方法を教えてください。詳細な説明は大歓迎です。
ありがとうございます!
私は最初のいくつかのコメントに基づいてユーザーから非常に便利な解決策を得ましたが、公開された画像はあまり役に立ちませんでした。
デフォルトでは、以下は3つのファイルの例です(「タブ」は少し混乱しています)。
ファイル1:
MAIN1 minor1 MAIN2 minor3
1 bla1 a blabla1
1 bla2 b blabla2
1 bla3 c blabla3
2 bla4 a blabla4
2 bla5 d blabla5
3 bla6 e blabla6
4 bla7 f blabla7
5 bla8 a blabla8
5 bla9 g blabla9
ファイル2:
minor8 MAIN1 MAIN2
yes1 2 d
yes2 3 e
yes3 4 f
yes4 5 a
yes5 5 g
yes6 1 a
yes7 1 b
yes8 1 c
yes9 2 a
ファイル3:
MAIN1 MAIN2 minor9
5 a sure1
5 g sure2
1 a sure3
1 b sure4
1 c sure5
2 a sure6
2 d sure7
3 e sure8
4 f sure9
必須出力ファイル:
MAIN1 minor1 MAIN2 minor3 minor8 minor9
1 bla1 a blabla1 yes6 sure3
1 bla2 b blabla2 yes7 sure4
1 bla3 c blabla3 yes8 sure5
2 bla4 a blabla4 yes9 sure6
2 bla5 d blabla5 yes1 sure7
3 bla6 e blabla6 yes2 sure8
4 bla7 f blabla7 yes3 sure9
5 bla8 a blabla8 yes4 sure1
5 bla9 g blabla9 yes5 sure2
G-Manのコードはこの出力ファイルを再生成することができるので、G-Manに感謝します!
私が言及するのを忘れたことの1つは、あなたのコードがこれをしないことです(私が知っている限り)。一致するものがない場合は、file1から行を削除します。
ファイル 2 と 3 の MAIN1 列と MAIN2 列が正確に一致しない場合でも、デフォルトではファイル 1 に対してこれらの行を保持する必要があります。一致するものがない場合は、特定のMAIN1とMAIN2の組み合わせの空の列項目を表示したいと思います。
私が説明する方法が十分に明確であることを願っています。
とにかく、助けてくれてありがとう。近いうちに、単に助けを求めるよりも、このフォーラムに貢献できることを願っています。
たとえば、ファイル2と3にMAIN1とMAIN2の組み合わせがない場合、出力は次のようになります。
MAIN1 minor1 MAIN2 minor3 minor8 minor9
1 bla1 a blabla1 yes6 sure3
1 bla2 b blabla2 yes7 sure4
1 bla3 c blabla3 sure5
2 bla4 a blabla4 yes9 sure6
2 bla5 d blabla5 yes1 sure7
3 bla6 e blabla6 yes2 sure8
4 bla7 f blabla7 yes3
5 bla8 a blabla8 yes4 sure1
5 bla9 g blabla9 yes5 sure2
これを可能にするためにG-Manのコードを編集する方法に関する提案はありますか?
答え1
次のファイルを生成します。
merge21
:
開始{ IFS="\t" OFS = "\t" } NR==FNR { #ファイル2 キー=$2","$3 存在[キー] = 1 小さな8[キー] =1 Next } {#ファイル1 キー=$1 "," $3 if (現在[キー]) $1, $2, $3, $4,マイナー8 [キー] }
merge312
:
開始{ IFS="\t" OFS = "\t" } NR==FNR { #ファイル3 キー=$1","$2 存在[キー] = 1 小さな9[キー] =$3 Next } {#ファイル1 +ファイル2 キー=$1 "," $3 if (現在[キー]) $1, $2, $3, $4,$5、未成年者9 [鍵] }
それらはほぼ同じです。違いを太字にしました。ここでコマンドを入力してください。
awk -f merge21 file2 file1 | awk -f merge312 file3 -
これはデータにカンマが含まれていないと仮定しますが、実際には存在するかどうかによって異なります。一部データに表示されない文字列です。より多くの列をサポートするためにこれを拡張することは容易ではありません。これできる一度にすべてのタスクを実行するように改善できますが、awk
これはもう少し複雑で(IMNSHO)努力する価値はありません。
これはファイル内のデータの「内部結合」を生成します。INNER接続とOUTER接続の違いいくつかの定義については、スタックオーバーフローを確認してください。これを「左外部結合」に変更したい場合は許可されます(そしてわいせつ投票)
この質問に対する答えは、「最初のテーブルのすべての行と他のテーブルの共通行」と解釈されます。最後のドアをmerge21
次に
if (present[key]) print $1, $2, $3, $4, minor8[key]
else print $1, $2, $3, $4, "-"
また、 ""行と""行をmerge312
削除したと仮定すると、出力は次のようになります。1
c
file2
4
f
file4
MAIN1 minor1 MAIN2 minor3 minor8 minor9
1 bla1 a blabla1 yes6 sure3
1 bla2 b blabla2 yes7 sure4
1 bla3 c blabla3 - sure5
2 bla4 a blabla4 yes9 sure6
2 bla5 d blabla5 yes1 sure7
3 bla6 e blabla6 yes2 sure8
4 bla7 f blabla7 yes3 -
5 bla8 a blabla8 yes4 sure1
5 bla9 g blabla9 yes5 sure2
そして当然削除することもできます。-
文字対sed
(もちろん、実際のデータに実際にハイフンが含まれている場合は、欠落しているデータのプレースホルダとして使用されていない文字または文字列を選択してください。)