Boşlukları değil, sekmeleri sınırlamak için sütunu nasıl kullanabilirim?


58

Bir columnmetni biçimlendirmek için Unix komutunu kullanmak istiyorum . Sekmelerle ayrılmış alanlarım var, ancak her alanın içinde de boşluklar var. columnbeyaz boşlukta sınırlamalar (sekmeler ve boşluklar). Sütunun sınırlayıcı olarak yalnızca sekmeleri kullanmasını nasıl sağlayabilirim?

Aşağıdakileri kullanarak sınırlayıcı olarak sekme belirtmeye çalışıyordum:

cat myfile | column -t -s"\t"

Yanıtlar:


81
column -t -s '\t'

sütunları \ve tkarakterleri ayırır .

column -s \tAynı şekilde column -s t, ters eğik çizgi kabuk tarafından bir alıntılama operatörü olarak yorumlanır.

Burada sütununa gerçek bir SEKME karakteri iletmek istiyorsunuz. Ksh93, zsh, bash, mksh, busybox sh veya FreeBSD sh ile:

column -ts $'\t'

Veya Ctrl-V Tab, kabuk istemine (tırnak işaretleri içinde veya öncesinde bir ters eğik çizgi ile gelen, sekme karakteri boşluk gibi kabuk sözdiziminde bir belirteç ayırıcı olduğu için) yazarak gerçek bir sekme karakteri girin ya da kullanın "$(printf '\t')"(split + glob'u devre dışı bırakmak için gerekli çift tırnaklar) sekme karakteri olarak operatör de varsayılan değerde olur $IFS).


3
Yapmam gereken column -t -s $'\t'bash düşünmek gibiydi olarak '\t'hem ortalama \ ve tancak $'\t'bir edebi sekmeyi anlamına gelir. Bash kokuyor
ThorSummoner

POSIX uyumluluğuna ihtiyacınız varsa (efendim yardım edin), lütfen bu fantastik cevaba dayanan cevabımı görün!
Nick Bull

Bu çözüm benim için çalıştı - $'\t'sınırlayıcı sekme yapar. Fakat awk -F "\t"bir sekmeyi awk için sınırlayıcı olarak kullandığımdan eminim . Bu neden işe yarıyor ve burada sütun için değil mi?
Mike,

3

Aşağıdakileri kullandım (yalnızca metniniz yoksa çalışır |):

cat myfile | tr '\t' '|' | column -t -s '|'

Bu sadece sekmeleri borularla değiştirir, ardından sınırlayıcı olarak borularla birlikte sütun kullanır.

(Bunu yaptım çünkü Stéphane'nin cevabında balık kabuğundan çıkan cevabında hiçbir şey görmedim. Aksi takdirde, Stéphane'nin cevabı iyi görünüyor.)


3

POSIX için, $'...'ANSI-C kaçış olarak da bilinir, tanımlanmaz.

Bunun yerine kullanabilirsiniz $(printf '\t'):

column -t -s "$(printf '\t')"

$(printf '\011')olarak kullanılabilir 011(ondalık 9 sekizlik temsili), yatay bir sekme karakteri için belirlenen ANSI kodudur:

column -t -s "$(printf '\011')"

Bununla birlikte, bunun neden kabuk sürümlerinde tutarlı olamayacağına ilişkin olarak Stéphane Chazelas'ın yorumuna bakınız.


2
POSIX'in SEKME kodlamasının ne olduğunu belirtmediğini unutmayın. Hala C yerel kodlaması EBCDIC tabanlı olan TIX'in 5 olduğu, ASCII'deki gibi 9 değil POSIX sistemleri var. Mümkün olan her durumda, cevabımda "$(printf '\t')"gösterildiği gibi bu tür sorunlardan kaçınmak için karakterlere isme göre başvurmak daha iyidir . $'...'POSIX şartnamesinin bir sonraki ana sürümüne dahil edilmesi planlandığını unutmayın .
Stéphane Chazelas 10:18

@ StéphaneChazelas $(printf '\t')POSIX nedir? Teşekkür ederim!
Nick Bull


@ StéphaneChazelas Çok teşekkür ederim, cevabımı çok yararlı
Nick Bull

2

-tİstediğiniz sütun sayısını seçimi içindir. Bu boşluktan çıkmak hiçbir şeyi değiştirmez. Ayrıca, sonra boşluk istiyorum -sbu yüzden bu deneyin:

cat myfile | column -s \t


Teşekkürler. Bu aradığım şeye yakın. Ancak, şimdi tüm çizgiler tek bir çizgide birleştirilir. Her çizgiyi kendi çizgisinde nasıl tutabilirim?
kaplumbağa

Varsayılan olarak, columnsatırları sütunlardan önce doldurur. İlginizi çekebilirpr
lurker
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.