명령의 출력이 있습니다.
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