更新:这是一个用于列表输出的更简单的脚本(该问题末尾的脚本)。只需将文件名传递给它即可,因为paste
它html
用来制作框架,因此可以进行调整。它确实保留了多个空格,并且遇到Unicode字符时,将保留列对齐。但是,编辑器或查看器呈现unicode的方式完全是另一回事...
┌──────────────────────┬────────────────┬──────────┬────────────────────────────┐
│ 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
#到目前为止,所有答案都使用此工具。#它可以处理多个文件;因此多列...好!#用Tab分隔每列...好。#其输出未制成表格。
下面的所有工具都删除了该定界符!...如果需要定界符,则不好。
column
#它删除了制表符分隔符,因此字段标识纯粹是按列处理的,它似乎处理得很好。.我没发现任何问题...#除了没有唯一的分隔符,它还可以正常工作!
expand
#仅具有单个制表符设置,因此超出2列是无法预测的##处理unicode时列的对齐方式不准确,并且删除了制表符定界符,因此字段标识完全是通过列对齐
pr
#仅具有一个选项卡设置,因此超过2列将无法预测。#在处理unicode时,列的对齐方式不准确,并且删除了制表符分隔符,因此字段标识纯粹是通过列对齐
对我来说,column
它是单线显然最好的解决方案。如果您想使用文件的分隔符或ASCII格式的表,请继续阅读,否则.. columns
太好了:)...
这是一个脚本,它使用任意数量的文件并创建ASCII格式的列表表示。.(请注意,Unicode可能无法呈现为预期的宽度,例如௵,它是单个字符。这与该列完全不同数字是错误的,例如上面提到的某些实用程序。)...脚本的输出,如下所示,来自4个输入文件,名为F1 F2 F3 F4 ...
+------------------------+-------------------+-------------------+--------------+
| 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...........