ファイルがあります(ファイル1.txt)、その内容は以下の通りである。
8145216 3377090 1.5
1405541 53595498 1.53637
上記のファイルの最初の2つの列に可能なすべての組み合わせを作成する必要があります。私php
はで議論されたプログラムを使用します。これ答えはすべての組み合わせを生成します。
組み合わせを見つけた後、私のファイルは次のようになります。
3377090 8145216
1405541 8145216
1405541 3377090
53595498 8145216
53595498 3377090
53595498 1405541
上記のファイルに3番目の列値を追加する必要があります。ファイル1.txt値が存在しない場合ファイル1.txt3番目の列にゼロを追加する必要があります。私が得ようとする最終結果は次のとおりです。
3377090 8145216 1.5
1405541 8145216 0
1405541 3377090 0
53595498 8145216 0
53595498 3377090 0
53595498 1405541 1.53637
答え1
awk 'NR==FNR{a[$1>=$2?$1SUBSEP$2:$2SUBSEP$1]=$3;next};
{k=$1>=$2?$1SUBSEP$2:$2SUBSEP$1; print $0, k in a?a[k]:0}' file1.txt file2.txt
3377090 8145216 1.5
1405541 8145216 0
1405541 3377090 0
53595498 8145216 0
53595498 3377090 0
53595498 1405541 1.53637
答え2
個人的には、半分はPHPを使用し、半分はAwkまたはPerlを使用するのではなく、元のファイルでAwkを使用してすべてを行います。与えられたファイル1.txt上記のように、次は目的の出力を生成します。
{
Vals[$1]++;
Vals[$2]++;
Third_col[$1, $2] = Third_col[$2, $1] = $3;
}
END{
for (i in Vals) {
for (j in Vals) {
if (i == j || (i SUBSEP j in printed)) { continue }
Third_col_val = (i SUBSEP j in Third_col) ? Third_col[i, j] : 0;
print i, j, Third_col_val;
printed[j, i]++;
printed[i, j]++
}
}
}
これにはO(n 2)時間がかかり、非常に大きなリスト(数百万行)の場合は遅くなり、メモリ集約的です。
答え3
別のawk
解決策:
$ awk 'FNR==NR{a[$1,$2]=$3;next}
{print $0,a[$1,$2]?a[$1,$2]:a[$2,$1]?a[$2,$1]:0}
' file1 file2
3377090 8145216 1.5
1405541 8145216 0
1405541 3377090 0
53595498 8145216 0
53595498 3377090 0
53595498 1405541 1.53637