列コマンドが列を正しくソートしないのはなぜですか?

列コマンドが列を正しくソートしないのはなぜですか?

別の質問で私は尋ねました。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

すべてのデータが改行なしで1つの長いストリームにある場合は、フィルタを使用してそれぞれを導入できます。4フィールド。 sedこのコマンドで行うことができます。

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

デフォルトでは、このcolumnコマンドは隣接する複数の区切り文字を単一の区切り記号にマージします。sedフィルタでこれを満たすには、次のものが必要です。

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

したがって、連続ストリームを分割する命令は、タブ区切り文字列です。なぜなら、4番目の文字列はすべて次のようになるからです。

<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オプションは複数の区切り文字を処理するDebianでのみ使用できます。

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です。コラム
 |繰り返すことができ、番号順にリストする必要はありません。 |
 |
 |注:このスクリプトはより複雑なスクリプトでハッキングされました。 |
 |コードは関係のないあらゆる種類の内容でいっぱいです。 |
  ------------------------------------- -------------

関連情報