2番目の列に基づいて数字でソートされた2つのファイルの結合

2番目の列に基づいて数字でソートされた2つのファイルの結合

ファイルが2つあります。

ファイル 1 には以下が含まれます。

2*J=0 EXP= 0.00000
2*J=4 EXP= 1.27911
2*J=8 EXP= 1.57613
2*J=12 EXP= 1.69134
2*J=10 EXP= 2.72705
2*J=16 EXP= 4.55689
2*J=20 EXP= 5.62138

ファイル 2 には以下が含まれます。

2*J=0 EXC= 0.00000
2*J=8 EXC= 1.21836
2*J=4 EXC= 1.59642
2*J=12 EXC= 1.78359
2*J=10 EXC= 2.69484
2*J=16 EXC= 7.24518
2*J=20 EXC= 7.32688

これら2つのファイルを組み合わせて、出力を次のようにしたいと思います。

2*J=0 EXP= 0.00000 EXC= 0.00000
2*J=4 EXP= 1.27911 EXC= 1.59642
2*J=8 EXP= 1.57613 EXC= 1.21836
2*J=12 EXP= 1.69134 EXC= 1.78359
2*J=10 EXP= 2.72705 EXC= 2.69484
2*J=16 EXP= 4.55689 EXC= 7.24518
2*J=20 EXP= 5.62138 EXC= 7.32688

答え1

GNU awkを使用すると、出力のソート方法を制御できます。

小木.awk

#!/usr/bin/env -S gawk -f

FILENAME == ARGV[1] {
    f1[$1] = $2 OFS $3
    sort_key[$1] = $3
    next
}

{
    f2[$1] = $2 OFS $3
}

function sorter(idx1, val1, idx2, val2) {
    return sort_key[idx1] - sort_key[idx2]
}

END {
    PROCINFO["sorted_in"] = "sorter"
    for (key in f1)
        print key, f1[key], f2[key]
}

それから

$ gawk -f joiner.awk file1 file2
2*J=0 EXP= 0.00000 EXC= 0.00000
2*J=4 EXP= 1.27911 EXC= 1.59642
2*J=8 EXP= 1.57613 EXC= 1.21836
2*J=12 EXP= 1.69134 EXC= 1.78359
2*J=10 EXP= 2.72705 EXC= 2.69484
2*J=16 EXP= 4.55689 EXC= 7.24518
2*J=20 EXP= 5.62138 EXC= 7.32688

「PROCINFO」マジックが文書化されています。https://www.gnu.org/software/gawk/manual/html_node/Controlling-Array-Traversal.html

答え2

の場合、join入力は結合キーに従って語彙的にソートする必要があります。別の方法で結果を並べ替える必要がある場合は、参加後に実行する必要があります。

$ join <(sort -bk1,1 file1) <(sort -bk1,1 file2) | sort -k3n
2*J=0 EXP= 0.00000 EXC= 0.00000
2*J=4 EXP= 1.27911 EXC= 1.59642
2*J=8 EXP= 1.57613 EXC= 1.21836
2*J=12 EXP= 1.69134 EXC= 1.78359
2*J=10 EXP= 2.72705 EXC= 2.69484
2*J=16 EXP= 4.55689 EXC= 7.24518
2*J=20 EXP= 5.62138 EXC= 7.32688

sort -k3n3番目のフィールドで始まる行の部分を数値でソートします。デフォルトでは、フィールドは空白ではなくフィールドから空白への変換に分かれているため、ソートキーには先行スペースと数字の後に続く内容が含まれますが、フィールドを解釈するときは両方とも数字で無視されます。スペースで区切られた3番目のフィールドを指定するより正確な方法は、スペースを削除してsort -bk3,3n選択することです。-b3,3ただ3番目のフィールドは実際には機能的な違いはありません。

プロセスの交換(<(...))はKornシェル拡張です。 inzshおよびbashケースとしても使用可能です。

sort -bk1,1joinスペースで区切られた最初のフィールドに基づいて語彙的にソートします(デフォルトではキーリンク)。

関連情報