3つのファイルがあり、file1.txt
ファイル形式は同じです。file2.txt
file3.txt
私はそれぞれ列2と列3に基づいてfile1.txt
出力ファイル内のレコードを選択したいと思います。file2.txt
file3.txt
out.txt
out2.txt
さらに、追加の列(4番目の列file2.txt
、5番目の列)を含む別のファイルを作成する必要がありますfile3.txt
。
入力例:
file1.txt
1. abc 1 a f11 f13 f14
2. abd 2 b f12 f14 f13
3. abe 4 d f13 f16 f12
4. acf 6 s f14 f15 f19
file2.txt
1. abc 1 a f21 f23 f24
2. abd 1 b f21 f24 f23
3. abe 4 d f24 f26 f22
4. acf 6 s f23 f25 f29
file3.txt
1. abc 1 a f31 f33 f34
2. abd 2 b f31 f34 f33
3. acf 5 s f33 f35 f39
4. abe 4 d f34 f36 f32
希望の出力
out.txt
1. abc 1 a f11 f13 f14
2. abe 4 d f13 f16 f12
out2.txt
1. abc 1 a f11 f13 f14 f21 f31
2. abe 4 d f13 f16 f12 f24 f34
答え1
確認したいかもしれません場所diff3に関して、このプログラムを使用して3つのファイルをサンプル出力として比較できます。
$ diff3 parent.txt your.txt mine.txt
====
1:1,2c Hello,
This is parent file.
2:1,2c Hello,
This is your file.
3:1,2c Hello,
This is my file.
あなたはそれを使用することができます
diff3 file1.txt file2.txt file3.txt > output.txt
答え2
利用可能なすべてのファイルから共有回線を選択するにはgrep
(out.txt
)
grep -ho ' [0-9] [a-z] ' file3 | grep -Fof - file2 | grep -Ff - file1
実行可能フィールド(変形)を選択し、それを使用してcut -d' ' -f3,4 file3
次から検索します。file2
file1
join
コマンドを使用して、通常どおり2つのファイルを結合します(驚きました!)(out2.txt
)
join -j 3 <(sort -k3,4 file1 | sed 's/ /+/3') \
<(join -j 3 <(sort -k3,4 file2 | sed 's/ /+/3') \
<(sort -k3,4 file3 | sed 's/ /+/3') \
-o '1.4 2.4 1.3') \
-o '1.1,1.2,1.3,1.4,1.5,2.1,2.2' | sed 's/+/ /'
したがって、3番目と4番目のフィールドを一緒に操作するには、それらをリンクする必要があります(+
たとえば、シンボルを介して)。join
ソートされた行でのみ作業するため、3sort
番目と4番目のフィールドで作業します。
最初にfile2
合計を結合すると、結果は符号を結合して削除するのとfile3
同じです。file1
+
sed
答え3
考えられる解決策awk
(あなたの質問で特定の要件が何であるかは明確ではないので、必要に応じて編集します):
awk 'FILENAME == ARGV[1] {
m[$2,$3] = 0; z[$2,$3] = $5;
next;
}
FILENAME == ARGV[2] {
if (($2,$3) in m) {
m[$2,$3] = 1;
z[$2,$3] = $5 " " z[$2,$3];
}
next;
}
{
if (($2,$3) in m && m[$2,$3] == 1) {
print $0 >"out.txt";
print $0 " " z[$2,$3] >"out2.txt";
}
}' file3.txt file2.txt file1.txt
3番目のファイルを読み取り、列2と列3のキーを使用して2つの配列を作成します。最初の配列はゼロで埋められ、2番目の配列はout2.txtファイルに必要な値で埋められます。次に、2番目のファイルを読み取り、列2と3のキーが最初の配列にあることを確認します。その場合は、値を0から1に変更し、必要な値をout2.txtの2番目の配列のファイルにリンクします。最後に、最初のファイルを読み取り、既存のキーを確認してから、次のようにout.txtファイルとout2.txtファイルの興味深い値を印刷します。
出力.txt以下を含める必要があります。
1. abc 1 a f11 f13 f14
3. abe 4 d f13 f16 f12
出力2.txt以下を含める必要があります。
1. abc 1 a f11 f13 f14 f21 f31
3. abe 4 d f13 f16 f12 f24 f34