열 명령이 열을 올바르게 정렬하지 않는 이유는 무엇입니까?

열 명령이 열을 올바르게 정렬하지 않는 이유는 무엇입니까?

또 다른 질문으로 제가 물었습니다.ls를 사용할 때 모든 .pyc 파일을 숨기는 방법, Ignacio는 다음과 같은 제안을 했습니다. ls | grep -v'.pyc$' |

위에서 언급했듯이 출력이 때때로 잘못 정렬되어 정확하게 작동하지 않습니다.

ceasarbautista@hse140:~/Desktop/Statistics/statistics/markov$ ls
README          __init__.pyc        markov.py       matrix2graph.pyc    pathfinder.pyc      priority_dict.pyc   spanning.py
__init__.py     graph.py        matrix2graph.py     pathfinder.py       priority_dict.py    space.py        vector.py
ceasarbautista@hse140:~/Desktop/Statistics/statistics/markov$ ls | grep -v '\.pyc$' | column
README      graph.py        matrix2graph.py priority_dict.py    spanning.py
__init__.py markov.py   pathfinder.py   space.py        vector.py

만족스러운 답변을 얻었지만, 열이 왜 이런 일을 하는지 궁금합니다(그리고 올바르게 인쇄되도록 수정할 수 있나요?).

답변1

옵션 없이 호출되면 column구분된 각 문자열을 가장 가까운 문자열에 정렬합니다.탭 정지 기둥. 터미널에서는 일반적으로 8자 열마다 나타납니다. 이 예를 살펴보십시오.

일부를 포함하는 파일( ztxt) 을 만듭니다.상표-특징 \t구분된 문자열은 3줄에 걸쳐 있고 개행 문자로 끝납니다 \n.

aaa1\taaaaaaaaaaaaaa2\taaaaaaaaaaaaaaaaaaa3\taaa4
bbbbbbb1\tbbb2\tbbb3
ccc1\tccc2

출력: column ztxt- 가장 가까운 것과 정확하게 정렬됨탭 정지

aaa1    aaaaaaaaaaaaaa2 aaaaaaaaaaaaaaaaaaa3    aaa4
bbbbbb1 bbb2    bbb3
ccc1    ccc2
|       |       |       |       |       |       |
|-------|-------|-------|-------|-------|-------|

각 연속 필드의 LSH를 그 위에 있는 필드와 정렬하려면 다음 옵션을 사용해야 합니다 -t. 예를 들면 다음과 같습니다.column -t ztxt

aaa1     aaaaaaaaaaaaaa2  aaaaaaaaaaaaaaaaaaa3  aaa4
bbbbbb1  bbb2             bbb3
ccc1     ccc2

모든 데이터가 개행 없이 하나의 긴 스트림에 있는 경우 필터를 사용하여 각각을 도입할 수 있습니다.4필드. sed이 명령으로 할 수 있습니다.

sed -re 's/(([^\t]*\t){3}[^\t]*)\t/\1\n/g' 

기본적으로 이 column명령은 인접한 여러 구분 기호를 단일 구분 기호로 병합합니다. sed필터에서 이를 충족 하려면 다음이 필요합니다.

sed -re 's/\t+/\t/g;' 

따라서 연속 스트림을 분할하는 명령은탭으로 구분됨문자열입니다. 왜냐하면 모든 네 번째 문자열은 다음과 같기 때문입니다.

<ztxt sed -re 's/\t+/\t/g;s/(([^\t]*\t){3}[^\t]*)\t/\1\n/g' | column -t  

이 연속 입력 스트림의 출력은 다음과 같습니다(원래 예제 입력을 사용하지만 원래 줄 바꿈을 탭으로 대체하여 수정되었습니다. 여전히 후행 \n을 유지해야 합니다).

aaa1      aaaaaaaaaaaaaa2  aaaaaaaaaaaaaaaaaaa3  aaa4
bbbbbbb1  bbb2             bbb3                  ccc1
ccc2

답변2

다중 구분 기호 비트의 경우. 짜증나게도 -n 옵션은 여러 구분 기호를 처리하는 데비안에서만 사용할 수 있습니다.

column -t -n <file>

답변3

출력에 인쇄할 수 없는 문자를 표시하려면(가능한 경우 C 이스케이프 코드로) ls명령 -b의 옵션을 사용할 수도 있습니다 ls.

ls -Cb | grep -v '\.pyc$' | column -t

답변4

열의 문제는 \s+로 분할된다는 것인데 단일 탭으로 분할하는 방법을 모르겠습니다. 저는 이 문제를 해결하기 위해 보다 유연한 스크립트를 작성했습니다. 이 스크립트는 누구나 무료로 사용할 수 있습니다.

http://itmat.greg.s3.amazonaws.com/display.pl.gz

전체 사용법은 다음과 같습니다.

  ------------------------------------- -------------
 |이 스크립트는 올바르게 정렬된 열에 탭으로 구분된 텍스트를 표시합니다. |
 |
 |사용법: perl display.pl [줄 수] [옵션] |
 |
 | 탭 구분 기호가 있는 위치입니다. |
 |
 |다음에 양의 정수 N이 오면 처음 N 행만|
 |반환됩니다. |
 |
 |행이 매우 긴 경우 "less -S"로 파이프되는 경우 스크립트가 가장 잘 작동합니다. |
 |
 [옵션] |
 |
 | -noheader: 기본적으로 헤더 행을 가정합니다. |
 |
 -nodots: 기본적으로 열이 넓고 열에 항목이 있는 경우 |
 |매우 짧으며 정리를 돕기 위해 끝에 점을 추가했습니다. |
 |점이 아닌 공백만 인쇄하려면 이 옵션을 사용하십시오. |
 |
 | -dotcols : 점으로 특정 열을 지정하려면 |
 |(-nodots 옵션 참조) 쉼표여야 합니다 |
 |공백 없이 공백으로 구분된 양의 정수 목록입니다. |
 |
 | -cols: 출력할 열의 하위 집합을 지정하는 데 사용합니다. |
 |는 쉼표로 구분된 양의 정수 목록입니다.
 | 및/또는 양의 정수 범위. 유효한 예 |
 |목록은 4, 6, 12 또는 4-10 또는 1-4, 12, 15, 4-7입니다. 칼럼 |
 |반복될 수 있으며 번호순으로 나열할 필요는 없습니다. |
 |
 | 참고: 이 스크립트는 더 복잡한 스크립트에서 해킹되었습니다. |
 |코드는 관련 없는 온갖 종류의 내용으로 가득 차 있습니다. |
  ------------------------------------- -------------

관련 정보