파일이 있습니다 (파일 1.txt), 그 내용은 다음과 같다.
8145216 3377090 1.5
1405541 53595498 1.53637
위 파일의 처음 두 열에 대해 가능한 모든 조합을 생성해야 합니다. 나는 php
에서 논의된 프로그램을 사용합니다.이것대답은 모든 조합을 생성합니다.
조합을 찾은 후 내 파일은 다음과 같습니다.
3377090 8145216
1405541 8145216
1405541 3377090
53595498 8145216
53595498 3377090
53595498 1405541
위 파일에서 세 번째 열 값을 추가해야 합니다.파일 1.txt값이 존재하지 않는 경우파일 1.txt세 번째 열에 0을 추가해야 합니다. 내가 얻으려는 최종 결과는 다음과 같습니다.
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