텍스트 파일을 테이블 형식으로 다시 정렬

텍스트 파일을 테이블 형식으로 다시 정렬

이 File1과 같은 두 개의 파일이 있습니다

Cat01_02.1 LAFP2
Cat01_02.1 NUSP8
Cat01_02.1 SP028
Cat01_02.1 ASP01
Cat02_03.1 LAFP5
Cat02_03.1 NUSP6
Cat02_03.1 SP027
Cat02_03.1 ASP08

파일 2

Dog06_04.7 LAFP2
Dog06_04.7 NUSP8
Dog06_04.7 SP028
Dog06_04.7 ASP01
Dog07_06.7 LAFP5
Dog07_06.7 NUSP6
Dog07_06.7 SP027
Dog07_06.7 ASP08

아래와 같이 이 파일에서 테이블을 만들어야 합니다.

Cat01_02.1 Dog06_04.7 LAFP2 NUSP8 SP028 ASP01
Cat02_03.1 Dog07_06.7 LAFP5 NUSP6 SP027 ASP08

Transpose 기능을 사용해 보았지만 여러 줄의 파일을 처리할 때 작동하지 않습니다

답변1

전체 문제가 무엇인지는 확실하지 않지만 두 번째 열의 키를 기반으로 첫 번째 열의 파일을 일치시킨 다음 두 번째 열의 키 그룹에서 다시 집계하는 것처럼 보입니다. 만약 그것이 올바른 이해라면, 아마도 효과가 있을 것입니다...

join -j 2 file2 file1 | sort -k 2 | awk '
    BEGIN{getline; k=$1; f=$2" "$3}
        { while (f==$2" "$3){k=k" "$1; next} print f, k; f=$2" "$3; k=$1}
    END{print f, k}'

두 번째 필드를 먼저 join출력한 다음 다른 필드를 두 번째 및 세 번째 필드로 출력합니다.

그런 다음 sort두 번째(기본적으로 세 번째) 필드의 결합 파일은 일치하는 고양이/개를 함께 그룹화합니다.

마지막으로, awk고양이/개 조합의 변경 사항이 얻어질 때까지 파일을 정렬하여 고양이/개 일치 항목을 집계하고, 고양이/개 조합의 각 변경 사항에서 마지막으로 일치하는 키의 집계된 문자열을 출력합니다.

답변2

cat File1 File2 | awk '{if (a[$2])a[$2]=a[$2]" "$1; else a[$2]=$1;}END{for (i in a) print i "-" a[i];}' | awk -F "-" '{if (a[$2])a[$2]=a[$2]" "$1; else a[$2]=$1;}END{for (i in a) print i " " a[i];}'

첫 번째 awk 명령을 사용하여 두 번째 열을 기준으로 그룹화합니다. 두 번째는 개와 고양이의 패턴을 기준으로 그룹화했습니다.

그러나 결과는 귀하의 예와 다르게 정렬됩니다. 여전히 좋기를 바랍니다.

답변3

단방향(출력 순서가 중요하지 않다고 가정):

join -1 2 -2 2 -o 1.1 2.1 1.2 file1 file2 | awk '{a[$1 FS $2] = a[$1 FS $2] FS $3;}END{for(i in a ){print i, a[i];}}'

join, 를 사용 file1하고 file2두 번째 열을 사용하여 결합합니다. awk를 사용하여 첫 번째 열을 키로 사용하여 결과를 누적합니다.

관련 정보