다음 예와 같이 공백으로 구분된 테이블이 있습니다.
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
먼저 스크립트는 (줄 번호)로 색인이 지정된 두 개의 배열( a
및 b
) 을 만듭니다. 배열의 모든 요소 NR
에 배열의 모든 요소를 추가하는 대신 첫 번째 요소는 제외합니다. 메모리가 제한된 경우에는 입력 파일을 두 번 전달하여 동일한 작업을 수행할 수 있습니다.a
b
k
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