gawkは2つのTSVを列ごとに結合します(SQL結合)。

gawkは2つのTSVを列ごとに結合します(SQL結合)。

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つのフィールドしか追加できないようです。12]、だから:

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

おすすめ記事