列別にテキストファイルをグループ化

列別にテキストファイルをグループ化

2つのテキストファイルがあります。最初の内容は次のとおりです。

Languages
Recursively enumerable
Regular

そして二番目の内容はこうです。

Minimal automaton
Turing machine
Finite

列ごとに1つのファイルにマージしたいです。だから試してみましたが、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使用されます。htmlUnicode文字が見つかったときに複数のスペースを保持し、列の並べ替えを維持します。しかし、エディタやビューアが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#このツールは、これまでに質問したすべての回答に共通です。 #複数のファイルを処理できるため、複数の列を処理できます。 #各列をタブで区切ります...良いです。 # 出力は表として作成されません。

以下のすべてのツールはこの区切り文字を削除します! ...区切り文字が必要な場合は悪いです。

column#タブ区切り文字を削除して、フィールドの識別が純粋に列単位で行われるようにすることはうまく処理されているようです。バグは見つかりませんでした。

expand#タブ設定が1つしかないため、2つの列を超えると予測できません。 #Unicodeを処理すると、列の並べ替えが正確ではなくタブ区切り文字が削除されるため、フィールドの識別は純粋に列の並べ替えでのみ行われます。

pr#タブセットが1つしかないため、2つ以上の列は予測できません。 #Unicodeを処理すると、列の並べ替えが不正確でタブ区切り文字が削除されるため、フィールドの識別は純粋に列の並べ替えでのみ行われます。

私にとって、columnこれは明らかに最高のシングルラインソリューションです。ファイルに区切り文字またはASCIIアートタブを使用したい場合は、読み続けてください。そうでなければ...columnsとても良いです:)...


これは、任意の数のファイルをインポートしてASCIIアートテーブルプレゼンテーションを作成するスクリプトです。 (Unicodeは、単一の文字である௵などの予想される幅をレンダリングしない可能性があることに注意してください。これは、上記のユーティリティの場合と同様に、列番号が間違っているのとはかなり異なります。)..スクリプトの出力(下図)は、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右にパディングする見える文字.(この例のみ)... 次に、paste2つの列を次のように連結します。商標性格...

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

さまざまな理由でNULL文字で問題が発生した場合は、次の手順を試してください。

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によって異なりますsedcolumn

関連情報