행을 열로 분할하고 그 중 일부가 오른쪽 정렬됩니까?

행을 열로 분할하고 그 중 일부가 오른쪽 정렬됩니까?

쉼표로 구분된 텍스트 줄을 일부 열이 오른쪽 정렬된 열로 분할하는 쉬운 방법이 있습니까?

보너스로 숫자 형식을 지정하면 좋겠지만 sed에서는 그다지 어렵지 않을 것입니다.

답변1

%42s나는 printf 형식을 생각했습니다. 시작하기 위한 간단한 스크립트는 다음과 같습니다. 절에 width[i]양수 값을 설정하면 BEGIN열이 지정된 너비(왼쪽 정렬)를 갖게 됩니다. 음수 인 경우 width[i]열은 i오른쪽 정렬되고 너비는 입니다 -width[i]. 스크립트는 넓은 필드를 지능적으로 처리하지 않으며 모든 후속 열은 행의 오른쪽으로 이동합니다.

awk -F, -vOFS= '
BEGIN {width[1]=-10; width[2]=8;}
{ for (i=1; i<=NF; i++) {$i = sprintf("%*s", width[i], $i)}
  print }'

숫자 필드가 있는 경우 추가 필드를 사용할 수 있습니다.printf 형식.

BSD 유틸리티가 있는 경우column(Debian에서 제공하지만 다른 Linux 배포판에 대해서는 모르겠습니다.) 쉽게 사용할 수 있습니다 column -t -s ,. 이점은 column열 너비를 자동으로 결정한다는 것입니다. 그러나 약간의 후처리를 통해 얻을 수는 있지만 복잡성이 그만한 가치가 있는지는 모르겠습니다.

Perl로 모든 것을 할 수 있습니다. 그것은체재시설이 도움이 될 수 있습니다.

일반적인 UNIX 도구를 사용하여 테이블 형식을 지정하는 보다 강력한 방법은 다음과 같습니다.tbl, 이는 *roff(man 페이지 포맷터) 처리 테이블의 일부입니다. 그러나 입력을 roff로 변환해야 하기 때문에 더 복잡하기도 합니다.

또 다른 가능한 도구는 텍스트 모드 브라우저입니다.w3m, 테이블 렌더링에 능숙합니다. 여기서 입력을 HTML로 변환해야 합니다.

답변2

결국 제가 직접 문제를 해결했습니다. 대신 을 column사용하여 awk열을 생성하세요. 예를 들어 foo.txt에 "bar,36,17.34566" 형식의 줄이 있으면 다음과 같이 할 수 있습니다.

cat foo.txt | awk -F, '{printf "%-20s %20d %20.2f\n", $1, $2, $3 }'

첫 번째 열은 왼쪽 맞춤, 나머지 두 열은 오른쪽 맞춤, 마지막 열의 정밀도는 소수점 이하 두 자리로, 너비가 20인 열을 생성합니다.

답변3

내 파이프라인:

| nl -nrz\
| rev\
| column -t\
| rev\
| cut -d' ' -f2-
  1. 고정 너비 접두사 열 추가
  2. 문자열의 역방향 문자
  3. 열을 왼쪽으로 정렬
  4. 문자열의 역방향 문자
  5. #1에 추가된 열을 제거합니다.

관련 정보