두 개의 텍스트 파일이 있습니다. 첫 번째 내용은 다음과 같습니다.
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