2つのファイルがありますfile1.txt
。file2.txt
列2と3に基づいて両方に共通のレコードを選択しfile1.txt
、それを追加の列(列4)にコピーしたいと思います。file2.txt
out.txt
file2.txt
入力例:
file1.txt
abc 1 a f11 f13 f14
abd 2 b f12 f14 f13
abe 4 d f13 f16 f12
acf 5 s f14 f15 f19
file2.txt
abc 1 a f21 f23 f24
abd 1 b f21 f24 f23
abe 4 d f24 f26 f22
acf 6 s f23 f25 f29
希望の出力
out.txt
abc 1 a f11 f13 f14 f21
abe 4 d f13 f16 f12 f24
私も同様の質問をしました。質問3つのファイルを活用して、同様の入力に基づいて同様の出力を抽出する方法については、前述のとおりです。私はUnixの世界に初めて触れ、ファイルの処理方法を学んでいます。これに基づいて、以下のコードを試してみましたawk
が、成功しませんでした。誰かが何が間違っているかを確認して提案できますか?
awk 'FILENAME == ARGV[1] {
m[$2,$3] = 0; z[$2,$3] = $6;
next;
}
{
if (($2,$3) in m && m[$2,$3] == 1) {
print $0 " " z[$2,$3] >"out.txt";
}
}' file2.txt file1.txt
答え1
アッ
awk 'FNR==NR {
a[$2, $3]=$4
next
}
($2, $3) in a{
print $0, a[$2, $3]
}
' file2.txt file1.txt > out.txt
参加する
join -j 2 \
<(sort -k2,3 file2.txt | sed 's/ /+/2') \
<(sort -k2,3 file1.txt | sed 's/ /+/2') \
-o 1.1,1.2,1.3,1.4,1.5,2.3 |
sed 's/+/ /' > out.txt
答え2
あなたの例では、値が0の配列mを生成します。 1に設定できず、設定する必要もありません。 $ 0など、行全体に値を設定できます。
この試み:
awk 'FILENAME == ARGV[1] {
m[$2,$3] = $0;
next;
}
{
if (($2,$3) in m) {
print m[$2,$3] " " $4 >"out.txt";
}
}' file1.txt file2.txt