가능한 모든 일치 쌍 및 관련 정보

가능한 모든 일치 쌍 및 관련 정보

","(ID, info1 및 info2)로 나누어진 3개의 열이 있는 입력으로 txt 파일이 있습니다. ID를 기반으로 가능한 모든 고유 일치 쌍이 있는 출력을 얻고 싶습니다. 일치하는 각 쌍에 대해 모든 관련 정보가 연결되어야 합니다.

입력.txt

Id,info1,info2
6,7.2,79.16
7,6.6,78.93
8,6.1,78.06

출력.txt

ID1,ID2,info1.1,info1.2,info2.1,info2.2 
6,7,7.2,6.6,79.16,78.93
6,8,7.2,6.1,79.16,78.06
7,8,6.6,6.1,78.93,78.06

어떻게 해야 하나요? 누구든지 나를 도와줄 수 있나요?

답변1

일부 Perl,목록::추가 유틸리티CPAN에서:

perl -MList::MoreUtils=zip -F, -lne '
    next if $. == 1;
    push @lines, [@F];
} END {
    print "id1,id2,info1.1,info1.2,info2.1,info2.2";
    for ($i = 0; $i < @lines - 1; $i++) {
        for ($j = $i+1; $j < @lines; $j++) {
            print join ",", zip @{$lines[$i]}, @{$lines[$j]};
        }
    }
' input.txt

답변2

csvsqlfrom을 사용하여 데이터베이스 테이블 자체 조인으로 수행할 수 있습니다.csvkit:

csvsql --no-inference --query '
  SELECT a.Id AS ID1, b.Id AS ID2, a.info1 AS [info1.1], b.info1 AS [info1.2], a.info2 AS [info2.1], b.info2 AS [info2.2] 
  FROM input a JOIN input b ON a.Id < b.Id
' input.txt
ID1,ID2,info1.1,info1.2,info2.1,info2.2
6,7,7.2,6.6,79.16,78.93
6,8,7.2,6.1,79.16,78.06
7,8,6.6,6.1,78.93,78.06

답변3

모든 Unix 시스템의 모든 쉘에서 awk를 사용하십시오.

$ cat tst.awk
BEGIN { FS=OFS="," }
{ map[NR] = $0 }
END {
    n = split(map[1],a)
    printf "%s%s%s%s", "ID1", OFS, "ID2", (k<n ? OFS : ORS)
    for ( k=2; k<=n; k++ ) {
        printf "%s.1%s%s.2%s", a[k], OFS, a[k], (k<n ? OFS : ORS)
    }
    for ( i=2; i<=NR; i++ ) {
        split(map[i],a)
        for ( j=i+1; j<=NR; j++ ) {
            split(map[j],b)
            for ( k=1; k<=n; k++ ) {
                printf "%s%s%s%s", a[k], OFS, b[k], (k<n ? OFS : ORS)
            }
        }
    }
}

$ awk -f tst.awk input.txt
ID1,ID2,info1.1,info1.2,info2.1,info2.2
6,7,7.2,6.6,79.16,78.93
6,8,7.2,6.1,79.16,78.06
7,8,6.6,6.1,78.93,78.06

관련 정보