1

Unix は初めてで、ハイフンで区切られたインデックスを持つフィールドに基づいて、2 つのタブ区切りのテキストファイルを結合するのに問題があります。例えば:

file1.txt
33-47   10      22      -99     10
33-48   15      22      165     456
33-101  10      22      -99     15.8
33-126  10      22      -99     15.5
34-133  10      22      -99     13
40-109  10      22      -99     12
41-102  88      21      -99     20
45-169  54      214     -99     4
100-11  652     524     87      5
101-25  45      54      153     8
101-26  1285    12      155     9.5

file2.txt
1       5432    545     33-101
1       5524    5420    33-126
0       855520  52220   33-47
0       5463    5420    34-133
0       5563    5423    40-109
1       6098    -99     40-109

基本的に、ファイル 1 はルックアップ テーブルであり、変数の完全なテーブルを作成するために、ファイル 1 の一致する行をファイル 2 に追加します。

file3.txt (expected)
1       5432    545     33-101  10      22      -99     15.8
1       5524    5420    33-126  10      22      -99     15.5
0       855520  52220   33-47   10      22      -99     10
0       5463    5420    34-133  10      22      -99     13
0       5563    5423    40-109  10      22      -99     12
1       6098    -99     40-109  10      22      -99     12

私は Cygwin を使用しており、最初にフィールドを通常どおり数値でソートし、LC_COLLATE=C ロケールといくつかの awk NR==FNR コマンドを使用してソートしようとしましたが、まだ空白の出力ファイルが得られます。

これはすべて新しく、非常にイライラします。できれば助けてください!

ありがとうございました!

4

2 に答える 2

1

これは私にとってはうまくいきますが、私はCygwinを使用していません:

awk 'NR==FNR{info[$1]=gensub(/[^\t]*\t/,"",1)} NR!=FNR{printf"%s\t%s\n",$0,info[$NF]}' file1.txt file2.txt

誰かがそれを改善できると確信しています...

于 2012-05-23T18:35:58.617 に答える
1

どのように仕事をするようになったのか、非常に興味がありますjoin

これは非常に醜い方法です:

a='{split($f, a, /-/); $f = sprintf("%05d%05d", a[1], a[2]); print}'
join -1 4 -2 1 -o 1.1 1.2 1.3 0 2.2 2.3 2.4 2.5 2.6 2.7 2.8 \
    <(awk -v f=4 "$a" file2.txt | sort -k4,4) | 
    <(awk -v f=1 "$a" file1.txt | sort) \
    awk 'BEGIN {OFS = "\t"} {$4 = substr($4, 1, 5) + 0 "-" substr($4, 6, 5) + 0; print}'

出力:

0       855520  52220   33-47   10      22      -99     10
1       5432    545     33-101  10      22      -99     15.8
1       5524    5420    33-126  10      22      -99     15.5
0       5463    5420    34-133  10      22      -99     13
0       5563    5423    40-109  10      22      -99     12
1       6098    -99     40-109  10      22      -99     12

-o出力指定を省略し(そしてフィールドをfinalから$4に変更して) コマンドを短縮した場合、出力は次のようになります (共通フィールドが最初)。$1awk

33-47   0       855520  52220   10      22      -99     10
33-101  1       5432    545     10      22      -99     15.8
33-126  1       5524    5420    10      22      -99     15.5
34-133  0       5463    5420    10      22      -99     13
40-109  0       5563    5423    10      22      -99     12
40-109  1       6098    -99     10      22      -99     12

上記は、キー フィールドの数字を左パディングしてハイフンを削除し、後で元に戻すことで機能します。これにより、単純な字句ソートが可能になります。

sort -Vパディング手法を使用する代わりに、(バージョンの並べ替え)を使用したくなりました。それは正しいソート順を与えますが、join同意しません。

于 2012-05-24T02:10:57.710 に答える