열별로 텍스트 파일 그룹화

열별로 텍스트 파일 그룹화

두 개의 텍스트 파일이 있습니다. 첫 번째 내용은 다음과 같습니다.

Languages
Recursively enumerable
Regular

그리고 두 번째 내용은 이렇습니다.

Minimal automaton
Turing machine
Finite

열별로 하나의 파일로 병합하고 싶습니다. 그래서 시도해 보았는데 paste 1 2결과는 다음과 같습니다.

Languages   Minimal automaton
Recursively enumerable  Turing machine
Regular Finite

그러나 열을 잘 정렬하고 싶습니다.

Languages               Minimal automaton
Recursively enumerable  Turing machine
Regular                 Finite

수동으로 수행하지 않고도 이를 달성할 수 있는지 궁금합니다.


다음에 추가:

약간의 정렬 오류를 제외하고는 블루스 접근 방식이 거의 효과가 있었던 또 다른 예가 있는데, 그 이유가 무엇인지 궁금합니다.

$ cat 1
Chomsky hierarchy
Type-0

$ cat 2
Grammars
Unrestricted

$ paste 1 2 | pr -t -e20
Chomsky hierarchy   Grammars
Type-0              Unrestricted
—                    (no common name)

답변1

당신은 단지 필요column명령을 실행하고 탭을 사용하여 열을 구분하도록 지시합니다.

paste file1 file2 | column -s $'\t' -t

"빈 셀" 논란을 해결하려면 다음 -n옵션 만 필요합니다 column.

$ paste <(echo foo; echo; echo barbarbar) <(seq 3) | column -s $'\t' -t
foo        1
2
barbarbar  3

$ paste <(echo foo; echo; echo barbarbar) <(seq 3) | column -s $'\t' -tn
foo        1
           2
barbarbar  3

내 칼럼의 매뉴얼 페이지에는 -n"Debian GNU/Linux Extensions"라고 나와 있습니다. 내 Fedora 시스템에는 빈 장치 문제가 없습니다. BSD에서 발생한 것으로 보이며 매뉴얼 페이지에 "버전 2.23에서 -s 옵션을 non-greedy로 변경했습니다"라고 나와 있습니다.

답변2

편리한 명령을 찾고 있습니다 pr.

paste file1 file2 | pr -t -e24

"-e24"는 "탭 정지를 24개 공백으로 확장"입니다. 다행히 paste열 사이에 탭 문자를 배치하면 pr열을 확장할 수 있습니다. 나는 "재귀적으로 열거 가능"의 문자 수를 세고 2를 더하여 24를 선택했습니다.

답변3

고쳐 쓰다: 다음은 표 형식 출력을 위한 더 간단한 스크립트(질문 끝에 있는 스크립트)입니다. 파일 이름을 전달하면 됩니다 . 크기 조정이 가능하도록 프레임을 만드는 paste데 사용됩니다 . html유니코드 문자가 발견될 때 여러 공백을 유지하고 열 정렬을 유지합니다. 그러나 편집자나 뷰어가 유니코드를 렌더링하는 방식은 완전히 다른 문제입니다...

┌──────────────────────┬────────────────┬──────────┬────────────────────────────┐
│ Languages            │ Minimal        │ Chomsky  │ Unrestricted               │
├──────────────────────┼────────────────┼──────────┼────────────────────────────┤
│ Recursive            │ Turing machine │ Finite   │     space indented         │
├──────────────────────┼────────────────┼──────────┼────────────────────────────┤
│ Regular              │ Grammars       │          │ ➀ unicode may render oddly │
├──────────────────────┼────────────────┼──────────┼────────────────────────────┤
│ 1 2  3   4    spaces │                │ Symbol-& │ but the column count is ok │
├──────────────────────┼────────────────┼──────────┼────────────────────────────┤
│                      │                │          │ Context                    │
└──────────────────────┴────────────────┴──────────┴────────────────────────────┘

#!/bin/bash
{ echo -e "<html>\n<table border=1 cellpadding=0 cellspacing=0>"
  paste "$@" |sed -re 's#(.*)#\x09\1\x09#' -e 's#\x09# </pre></td>\n<td><pre> #g' -e 's#^ </pre></td>#<tr>#' -e 's#\n<td><pre> $#\n</tr>#'
  echo -e "</table>\n</html>"
} |w3m -dump -T 'text/html'

---

도구 개요(지금까지) 답변에서 제안되었습니다.
나는 그것들을 매우 주의 깊게 살펴보았습니다. 내가 발견한 것은 다음과 같습니다.

paste# 이 도구는 지금까지 질문한 모든 답변에 공통적입니다. # 여러 파일을 처리할 수 있으므로 여러 열을 처리할 수 있습니다. # 각 열을 탭으로 구분합니다... 좋네요. # 출력은 표로 작성되지 않습니다.

아래의 모든 도구는 이 구분 기호를 제거합니다! ...구분자가 필요한 경우에는 좋지 않습니다.

column# 탭 구분 기호를 제거하여 필드 식별이 순전히 열 단위로 이루어지도록 하는 것이 잘 처리되는 것 같습니다. 버그는 발견되지 않습니다... # 고유 구분 기호가 없다는 점만 빼면 훌륭하게 작동합니다!

expand# 탭 설정이 하나만 있으므로 2개 열을 초과하면 예측할 수 없습니다. # 유니코드를 처리할 때 열 정렬이 정확하지 않고 탭 구분 기호를 제거하므로 필드 식별은 순전히 열 정렬로만 수행됩니다.

pr# 탭 세트가 하나만 있으므로 2개 이상의 열은 예측할 수 없습니다. # 유니코드를 처리할 때 열 정렬이 부정확하고 탭 구분 기호가 제거되므로 필드 식별은 순전히 열 정렬로만 수행됩니다.

나에게 column이것은 분명히 최고의 단일 라인 솔루션입니다. 파일에 구분 기호나 ASCII 아트 탭을 원하면 계속 읽으세요. 그렇지 않으면... columns아주 좋습니다 :)...


이것은 임의의 수의 파일을 가져와 ASCII 아트 테이블 프레젠테이션을 만드는 스크립트입니다. (유니코드는 단일 문자인 ௵와 같은 예상 너비를 렌더링하지 않을 수 있다는 점을 명심하십시오. 이는 위에서 언급한 일부 유틸리티의 경우처럼 열 번호가 잘못된 것과는 매우 다릅니다.) .. . 스크립트의 출력(아래 표시)은 F1 F2 F3 F4...라는 이름의 4개 입력 파일에서 나옵니다.

+------------------------+-------------------+-------------------+--------------+
| Languages              | Minimal automaton | Chomsky hierarchy | Grammars     |
| Recursively enumerable | Turing machine    | Type-0            | Unrestricted |
| Regular                | Finite            | —                 |              |
| Alphabet               |                   | Symbol            |              |
|                        |                   |                   | Context      |
+------------------------+-------------------+-------------------+--------------+

#!/bin/bash

# Note: The next line is for testing purposes only!
set F1 F2 F3 F4 # Simulate commandline filename args $1 $2 etc...

p=' '                                # The pad character
# Get line and column stats
cc=${#@}; lmax=                      # Count of columns (== input files)
for c in $(seq 1 $cc) ;do            # Filenames from the commandline 
  F[$c]="${!c}"        
  wc=($(wc -l -L <${F[$c]}))         # File length and width of longest line 
  l[$c]=${wc[0]}                     # File length  (per file)
  L[$c]=${wc[1]}                     # Longest line (per file) 
  ((lmax<${l[$c]})) && lmax=${l[$c]} # Length of longest file
done
# Determine line-count deficits  of shorter files
for c in $(seq 1 $cc) ;do  
  ((${l[$c]}<lmax)) && D[$c]=$((lmax-${l[$c]})) || D[$c]=0 
done
# Build '\n' strings to cater for short-file deficits
for c in $(seq 1 $cc) ;do
  for n in $(seq 1 ${D[$c]}) ;do
    N[$c]=${N[$c]}$'\n'
  done
done
# Build the command to suit the number of input files
source=$(mktemp)
>"$source" echo 'paste \'
for c in $(seq 1 $cc) ;do
    ((${L[$c]}==0)) && e="x" || e=":a -e \"s/^.{0,$((${L[$c]}-1))}$/&$p/;ta\""
    >>"$source" echo '<(sed -re '"$e"' <(cat "${F['$c']}"; echo -n "${N['$c']}")) \'
done
# include the ASCII-art Table framework
>>"$source" echo ' | sed  -e "s/.*/| & |/" -e "s/\t/ | /g" \'   # Add vertical frame lines
>>"$source" echo ' | sed -re "1 {h;s/[^|]/-/g;s/\|/+/g;p;g}" \' # Add top and botom frame lines 
>>"$source" echo '        -e "$ {p;s/[^|]/-/g;s/\|/+/g}"'
>>"$source" echo  
# Run the code
source "$source"
rm     "$source"
exit

내 원래 답변은 다음과 같습니다(위 스크립트를 대체하기 위해 약간 수정됨).

wc열 너비를 얻는 데 사용됩니다 .sed 오른쪽에 패딩하는보이는문자 .(이 예에만 해당)... 그런 다음paste 두 열을 다음과 같이 연결합니다.상표성격...

paste <(sed -re :a -e 's/^.{1,'"$(($(wc -L <F1)-1))"'}$/&./;ta' F1) F2

# output (No trailing whitespace)
Languages.............  Minimal automaton
Recursively enumerable  Turing machine
Regular...............  Finite

올바른 열을 채우려면 다음을 수행하십시오.

paste <( sed -re :a -e 's/^.{1,'"$(($(wc -L <F1)-1))"'}$/&./;ta' F1 ) \
      <( sed -re :a -e 's/^.{1,'"$(($(wc -L <F2)-1))"'}$/&./;ta' F2 )  

# output (With trailing whitespace)
Languages.............  Minimal automaton
Recursively enumerable  Turing machine...
Regular...............  Finite...........

답변4

Glenn jackman의 답변에 대해서는 언급할 수 없으므로 Peter.O가 지적한 빈 셀 문제를 해결하기 위해 이 내용을 추가하고 있습니다. 각 탭 앞에 null 문자를 추가하면 단일 구분 기호로 처리되는 구분 기호 실행이 제거되고 문제가 해결됩니다. (원래 공백을 사용했지만 널 문자를 사용하면 열 사이의 추가 공백이 제거되었습니다.)

paste file1 file2 | sed 's/\t/\0\t/g' | column -s $'\t' -t

다양한 이유로 널 문자로 인해 문제가 발생하는 경우 다음을 시도해 보십시오.

paste file1 file2 | sed 's/\t/ \t/g' | column -s $'\t' -t

또는

paste file1 file2 | sed $'s/\t/ \t/g' | column -s $'\t' -t

두 가지 모두의 구현은 Unix/Linux 버전과 특히 BSD(및 Mac OS X)와 GNU/Linux에 따라 다른 sed것으로 보입니다 .column

관련 정보