두 번째 열이 변경되면 어떻게 세 번째 열을 동일하게 유지합니까?

두 번째 열이 변경되면 어떻게 세 번째 열을 동일하게 유지합니까?

명령의 출력이 있습니다.

CPU_SrcID#0_MC#0_Chan#0_DIMM#0  0  0      A1
CPU_SrcID#0_MC#0_Chan#1_DIMM#0  0  0      A2
CPU_SrcID#0_MC#0_Chan#2_DIMM#0  0  0      A3
CPU_SrcID#0_MC#1_Chan#0_DIMM#0  0  0      A4
CPU_SrcID#0_MC#1_Chan#1_DIMM#0  0  0      A5
CPU_SrcID#0_MC#1_Chan#2_DIMM#0  0  1      A6
CPU_SrcID#1_MC#0_Chan#0_DIMM#0  0  0      B1
CPU_SrcID#1_MC#0_Chan#1_DIMM#0  0  0      B2
CPU_SrcID#1_MC#0_Chan#2_DIMM#0  0  0      B3
CPU_SrcID#1_MC#1_Chan#0_DIMM#0  0  0      B4
CPU_SrcID#1_MC#1_Chan#1_DIMM#0  0  0      B5
CPU_SrcID#1_MC#1_Chan#2_DIMM#0  0  0      B6

그래서 내 모든 칼럼은 직선입니다. 변경되는 유일한 숫자는 2열과 3열의 숫자입니다. 그러나 숫자 중 하나가 소수점 이하 두 자리 이상으로 변경되면 세 번째 열이 나머지 열과 일치하지 않게 됩니다.

CPU_SrcID#0_MC#0_Chan#0_DIMM#0  0  0      A1
CPU_SrcID#0_MC#0_Chan#1_DIMM#0  15  0      A2
CPU_SrcID#0_MC#0_Chan#2_DIMM#0  0  0      A3
CPU_SrcID#0_MC#1_Chan#0_DIMM#0  0  0      A4
CPU_SrcID#0_MC#1_Chan#1_DIMM#0  0  0      A5
CPU_SrcID#0_MC#1_Chan#2_DIMM#0  0  347      A6
CPU_SrcID#1_MC#0_Chan#0_DIMM#0  0  0      B1
CPU_SrcID#1_MC#0_Chan#1_DIMM#0  0  0      B2
CPU_SrcID#1_MC#0_Chan#2_DIMM#0  0  0      B3
CPU_SrcID#1_MC#1_Chan#0_DIMM#0  0  0      B4
CPU_SrcID#1_MC#1_Chan#1_DIMM#0  0  0      B5
CPU_SrcID#1_MC#1_Chan#2_DIMM#0  0  0      B6

숫자의 소수점 이하 자릿수에 관계없이 어떻게 열을 정확하게 유지할 수 있습니까? 이것이 내가 원하는 방식입니다.

CPU_SrcID#0_MC#0_Chan#0_DIMM#0  0  0      A1
CPU_SrcID#0_MC#0_Chan#1_DIMM#0  15 0      A2
CPU_SrcID#0_MC#0_Chan#2_DIMM#0  0  0      A3
CPU_SrcID#0_MC#1_Chan#0_DIMM#0  0  0      A4
CPU_SrcID#0_MC#1_Chan#1_DIMM#0  0  0      A5
CPU_SrcID#0_MC#1_Chan#2_DIMM#0  0  347    A6
CPU_SrcID#1_MC#0_Chan#0_DIMM#0  0  0      B1
CPU_SrcID#1_MC#0_Chan#1_DIMM#0  0  0      B2
CPU_SrcID#1_MC#0_Chan#2_DIMM#0  0  0      B3
CPU_SrcID#1_MC#1_Chan#0_DIMM#0  0  0      B4
CPU_SrcID#1_MC#1_Chan#1_DIMM#0  0  0      B5
CPU_SrcID#1_MC#1_Chan#2_DIMM#0  0  0      B6

답변1

코드를 수정할 수 없는 경우생산하다서식을 지정하면 처음부터 정렬된 열이 포함된 데이터가 생성되며, 그런 다음 이 column유틸리티를 사용하여 출력을 사후 처리할 수 있습니다.

some_command | column -t

질문에서 잘못 정렬된 데이터를 실행하면 column -t다음과 같은 출력이 생성됩니다.

CPU_SrcID#0_MC#0_Chan#0_DIMM#0  0   0    A1
CPU_SrcID#0_MC#0_Chan#1_DIMM#0  15  0    A2
CPU_SrcID#0_MC#0_Chan#2_DIMM#0  0   0    A3
CPU_SrcID#0_MC#1_Chan#0_DIMM#0  0   0    A4
CPU_SrcID#0_MC#1_Chan#1_DIMM#0  0   0    A5
CPU_SrcID#0_MC#1_Chan#2_DIMM#0  0   347  A6
CPU_SrcID#1_MC#0_Chan#0_DIMM#0  0   0    B1
CPU_SrcID#1_MC#0_Chan#1_DIMM#0  0   0    B2
CPU_SrcID#1_MC#0_Chan#2_DIMM#0  0   0    B3
CPU_SrcID#1_MC#1_Chan#0_DIMM#0  0   0    B4
CPU_SrcID#1_MC#1_Chan#1_DIMM#0  0   0    B5
CPU_SrcID#1_MC#1_Chan#2_DIMM#0  0   0    B6

이 작업의 한 가지 가능한 단점은 column -t열 사이의 최소 거리가 두 공간으로 줄어든다는 것입니다.

아래 정렬되지 않은 데이터에 표시된 것처럼 데이터와 함께 정렬 문자(필드 구분 기호)를 출력하여 이 문제를 "수정"할 수도 있습니다.

CPU_SrcID#0_MC#0_Chan#0_DIMM#0  |0  |0      |A1         
CPU_SrcID#0_MC#0_Chan#1_DIMM#0  |15  |0      |A2        
CPU_SrcID#0_MC#0_Chan#2_DIMM#0  |0  |0      |A3         
CPU_SrcID#0_MC#1_Chan#0_DIMM#0  |0  |0      |A4         
CPU_SrcID#0_MC#1_Chan#1_DIMM#0  |0  |0      |A5         
CPU_SrcID#0_MC#1_Chan#2_DIMM#0  |0  |347      |A6       
CPU_SrcID#1_MC#0_Chan#0_DIMM#0  |0  |0      |B1         
CPU_SrcID#1_MC#0_Chan#1_DIMM#0  |0  |0      |B2         
CPU_SrcID#1_MC#0_Chan#2_DIMM#0  |0  |0      |B3         
CPU_SrcID#1_MC#1_Chan#0_DIMM#0  |0  |0      |B4         
CPU_SrcID#1_MC#1_Chan#1_DIMM#0  |0  |0      |B5         
CPU_SrcID#1_MC#1_Chan#2_DIMM#0  |0  |0      |B6        

이 데이터를 사용하면 column -t -s '|'다음과 같은 결과가 발생합니다.

CPU_SrcID#0_MC#0_Chan#0_DIMM#0    0     0          A1         
CPU_SrcID#0_MC#0_Chan#1_DIMM#0    15    0          A2        
CPU_SrcID#0_MC#0_Chan#2_DIMM#0    0     0          A3         
CPU_SrcID#0_MC#1_Chan#0_DIMM#0    0     0          A4         
CPU_SrcID#0_MC#1_Chan#1_DIMM#0    0     0          A5         
CPU_SrcID#0_MC#1_Chan#2_DIMM#0    0     347        A6       
CPU_SrcID#1_MC#0_Chan#0_DIMM#0    0     0          B1         
CPU_SrcID#1_MC#0_Chan#1_DIMM#0    0     0          B2         
CPU_SrcID#1_MC#0_Chan#2_DIMM#0    0     0          B3         
CPU_SrcID#1_MC#1_Chan#0_DIMM#0    0     0          B4         
CPU_SrcID#1_MC#1_Chan#1_DIMM#0    0     0          B5         
CPU_SrcID#1_MC#1_Chan#2_DIMM#0    0     0          B6

답변2

일반적으로 데이터를 생성한 방법에 따라 다릅니다. 예를 들어 특정 유형의 명령문(C, bash 또는 다른 언어)이 있는 경우 printf필드 너비를 설정해야 합니다.

예를 들어 Bash에서는 다음과 같습니다.

printf "%30s %3d %3d %5s" "CPU_SrcID#1_MC#1_Chan#2_DIMM#0" 0 347 A6

번호는 최대 3자리까지만 정렬됩니다.

생성을 제어할 수 없는 경우 필드를 정렬하는 일반적인 방법은 명령을 사용하는 것입니다 column. 명령을 파이프 column -t한 후 다음과 같이 정렬합니다.

CPU_SrcID#0_MC#0_Chan#0_DIMM#0  0   0    A1
CPU_SrcID#0_MC#0_Chan#1_DIMM#0  15  0    A2
CPU_SrcID#0_MC#0_Chan#2_DIMM#0  0   0    A3
CPU_SrcID#0_MC#1_Chan#0_DIMM#0  0   0    A4
CPU_SrcID#0_MC#1_Chan#1_DIMM#0  0   0    A5
CPU_SrcID#0_MC#1_Chan#2_DIMM#0  0   347  A6
CPU_SrcID#1_MC#0_Chan#0_DIMM#0  0   0    B1
CPU_SrcID#1_MC#0_Chan#1_DIMM#0  0   0    B2
CPU_SrcID#1_MC#0_Chan#2_DIMM#0  0   0    B3
CPU_SrcID#1_MC#1_Chan#0_DIMM#0  0   0    B4
CPU_SrcID#1_MC#1_Chan#1_DIMM#0  0   0    B5
CPU_SrcID#1_MC#1_Chan#2_DIMM#0  0   0    B6

이렇게 하면 숫자가 오른쪽이 아닌 왼쪽으로 정렬됩니다 printf. 일반적으로 숫자를 오른쪽 정렬하는 것이 더 좋으므로 세대를 변경하는 것이 좋습니다. 일부 버전에서는 두 열을 오른쪽으로 정렬하는 column옵션을 추가할 수 있지만 -R 2,3해당 버전에는 해당 옵션이 없을 수도 있습니다.

형식을 더 많이 제어하려면 출력을 루프로 파이프 while read하고 이를 사용하여 printf다음과 같이 값을 다시 인쇄할 수 있습니다.

command | while read label num1 num2 code
do printf "%30s %3d %3d      %2s\n" "$label" "$num1" "$num2" "$code"
done

관련 정보