전치된 행의 두 번째 열을 인쇄합니다.

전치된 행의 두 번째 열을 인쇄합니다.

다음 예와 같이 공백으로 구분된 테이블이 있습니다.

A 101
B 92 102
C 83 93 103
D 74 84 94 104

나는 이것을 얻고 싶다:


  • 샘플 A와 관련 값이 있는 모든 두 번째 열(샘플 B의 첫 번째 값으로 시작)이 한 행 (즉, 전체 첫 번째 행에 이어 각 후속 행의 두 번째 필드가 옴) 으로 바뀌고 ,

  • 연관된 값이 있는 샘플 B와 모든 두 번째 열(샘플 C의 첫 번째 값으로 시작)이 한 행 (즉, 전체 두 번째 행에 이어 각 후속 행의 두 번째 필드가 옴)으로 바뀌고 ,
  • 등.

내 출력의 처음 4개 행 중 처음 5개 열은 다음과 같습니다.

A 101 92 83 74 …
B 92 102 83 74 …
C 83 93 103 74 …
D 74 84 94 104 …

답변1

awk '
{
    a[NR]=$0
    b[NR]=$2
}
END{
    for(i=1;i<=NR;i++){
        k=i+1
        printf("%s ",a[i])
        for(j=k;j<=NR;j++)
            printf("%s ",b[j])
        print ""
    }
}' table.file

먼저 스크립트는 (줄 번호)로 색인이 지정된 두 개의 배열( ab) 을 만듭니다. 배열의 모든 요소 NR에 배열의 모든 요소를 ​​추가하는 대신 첫 번째 요소는 제외합니다. 메모리가 제한된 경우에는 입력 파일을 두 번 전달하여 동일한 작업을 수행할 수 있습니다.abk

awk '
NR==FNR{
    b[NR]=$2
    rows=NR
    next
}
{
    printf("%s ",$0)
    for(j=FNR+1;j<=rows;j++)
        printf("%s ",b[j])
    print ""
    }
}' table.file table.file

관련 정보