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

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

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

おすすめ記事