TSVファイルを追加する方法、例:
TSV
c 7 r z
d 6 s w
f 1 f f
b 8 p y
a 9 q x
TSV
a q a
c r ccc
b p bb
0 0 0
d s dddd
where a$1,a$3==b$1,b$2
ここでは列単位で「結合」して残り(a$2、a$4、b$3)を表示したいと思います。
6 w dddd
9 x a
8 y bb
7 z ccc
問題はgawkでこれをどうしますか?
行の順序が要件を満たしていません。(出力では、入力の行の順序は定義されておらず、a.tsvとb.tsvで異なる場合があります。リレーショナルデータベースの行と同じ順序はありません。)
一意性の説明key={a$1,a$3}
:最初は「.Asの一意性」を想定しました。グレンジャックマン注 - キーに基づいて一意の行を許可しないため、元の問題の説明では想定できません。ありがとうございます。グレン。
ベストアンサー1
join
このコマンドは1つのフィールドしか追加できないようです。1、2]、だから:
awk '
BEGIN {FS=OFS="\t"}
NR==FNR {a[$1 FS $3] = $2 FS $4; next}
$1 FS $2 in a {print a[$1 FS $2], $3}
' a.tsv b.tsv
コメントによる更新:指定されたキーが一意ではないため、「a.tsv」で複数の項目を作成する技術があります。
awk '
BEGIN {FS=OFS="\t"}
NR==FNR {
key = $1 FS $3
if (key in a)
a[key] = a[key] "\n" $2 FS $4
else
a[key] = $2 FS $4
next
}
$1 FS $2 in a {
split(a[$1 FS $2], ary, /\n/)
for (idx in ary)
print ary[idx], $3
}
' a.tsv b.tsv