Kabuk betiği kullanarak bir metin dosyasındaki değerleri sütunlu dosyaya yazdırma


11

Aşağıdaki gibi bir kabuk komut dosyası çalıştıran bir output.txt var:

abc.txt
errorstatus1
Fri Nov 11 02:00:09 2016
def.txt
errorstatus2.txt
Sat Nov 12 03:00:09 2016

Metin dosyası aynı şekilde satır satır birden çok giriş içerir. Bu değerleri sütunlara yazdırmak istiyorum: Dosya adı, Durum ve Zaman Damgası aşağıdaki gibi:

Filename      Status        Timestamp
abc.txt     errorstatus1   Fri Nov 11 02:00:09 2016
def.txt     errorstatus2   Sat Nov 12 03:00:09 2016

4
Örnek biçim bir CSV dosyası değil, sabit sütun genişliğindeki bir dosyadır. Soruyu açıklığa kavuşturmak veya doğru bir örnek vermek isteyebilirsiniz.
AlexP

Örneğin bir CVS biçimi değil . CVS biçimidir abc.txt,errorstatus1,Fri Nov 11 02:00:09 2016. Sorunuzu, söylediklerinizi sağladığınız örnekle eşleşecek şekilde düzenledim. Geri dönmekten çekinmeyin, ancak tam olarak ne istediğinizi açıklığa kavuşturmanız gerektiğini lütfen unutmayın - sütunlu değerler veya virgülle ayrılmış değerler
Sergiy Kolodyazhnyy

Yanıtlar:


14

İle paste:

paste - - - <file.txt

bu, satır satırından ayrılmış dosya içeriğini sütunlar ve satır başına üç sekmeyle ayrılmış sütun çıktısı verir.

Üstbilgi ekleniyor:

echo Filename Status Timestamp; paste - - - <file.txt

Çıktıyı sütunlaştırmak için yardım alın column:

{ echo Filename Status Timestamp; paste - - - <file.txt ;} | column -t

Misal:

% cat file.txt
abc.txt
errorstatus1
Fri Nov 11 02:00:09 2016
def.txt
errorstatus2.txt
Sat Nov 12 03:00:09 2016

% { echo Filename Status Timestamp; paste - - - <file.txt ;} | column -t
Filename  Status            Timestamp
abc.txt   errorstatus1      Fri        Nov  11  02:00:09  2016
def.txt   errorstatus2.txt  Sat        Nov  12  03:00:09  2016

Güzel! Teşekkürler!! Ancak bu değerleri excel formatında nasıl yazdırabilirsiniz. Excel sayfasındaki Sütun başlıklarını Dosya Adı Durumu ve Zaman Damgası ve altındaki değerleri istiyorum
linux09

@ linux09 Bir CSV oluşturun ve Excel ile içe aktarın:echo Filename,Status,Timestamp; paste -d ',' - - - <file.txt
heemayl

Parlak! Tıkır tıkır çalışıyor. Çok teşekkür ederim
linux09

6

Awk kullanabilirsiniz:

awk 'NR % 3 {printf "%s ", $0; next}1'

Çıktı pek hoş olmayabilir:

$ awk 'NR % 3 {printf "%s ", $0; next} 1' input
abc.txt errorstatus1 Fri Nov 11 02:00:09 2016
def.txt errorstatus2.txt Sat Nov 12 03:00:09 2016

Bunun %s\tyerine sekmeyle ayrılmış çıktı için kullanabilirsiniz .

  • NR % 3her üçüncü satır için sıfır (ve yanlış) olduğundan, diğer satırlara satırsonu yerine boşluk bırakılır. nextsadece bir sonraki yinelemeye başlar.
  • Her üçüncü satır, 1ilk blokla eşleşmediğinden, sondan sonraki gibi yeni satırla birlikte yazdırılır .

5

Ayrıca rs(BSD r e s hape yardımcı programı):

DESCRIPTION
     rs reads the standard input, interpreting each line as a row of blank-
     separated entries in an array, transforms the array according to the
     options, and writes it on the standard output.  With no arguments it
     transforms stream input into a columnar format convenient for terminal
     viewing.

Özellikle,

     -e      Consider each line of input as an array entry.

Yani

$ rs -e < file
abc.txt                   errorstatus1              Fri Nov 11 02:00:09 2016
def.txt                   errorstatus2.txt          Sat Nov 12 03:00:09 2016

veya (başlığı eklemek için)

$ { printf '%s\n' Filename Status Timestamp ; cat file ; } | rs -e
Filename                  Status                    Timestamp
abc.txt                   errorstatus1              Fri Nov 11 02:00:09 2016
def.txt                   errorstatus2.txt          Sat Nov 12 03:00:09 2016

3

Tamlık için bunu da yapabilirsiniz sed:

sed -e '1iFilename\tStatus\tTimestamp' -e 'N;N;y/\n/\t/' file.txt
  • 1iFilename\tStatus\tTimestamp başlık satırını satır 1'den önce ekler
  • N;N desen arabelleğine iki satır daha okur, toplam 3 satır satır ayrı satır verir
  • y/\n/\t/ tüm yeni satırları kalıp arabelleğindeki sekmelerle değiştirir

i, NVe ysed komutları burada belgelenmiştir .


Harika .. Kullandığınız ifadelere kısaca yorum yapabilir misiniz? Teşekkür!
Campa

evet, mükemmel dostum
Campa

1

AWK veya Perl ve tabii ki bu cevabın sağladığı Python ile metin işleme için bir şeyler pişirmek her zaman mümkündür.

Tek astar olarak:

python -c 'import sys;print "Filename\tStatus\tTimestamp"; lines=[l.strip() for l in sys.stdin];print "".join([l+"\n" if i%3 == 0 else l+"\t" for i,l in enumerate(lines,1) ])' < input.txt

Çok satırlı komut dosyası olarak

import sys
print "Filename\tStatus\tTimestamp"
lines=[l.strip() for l in sys.stdin]
print "".join([l+"\n" if i%3 == 0 else l+"\t" for i,l in enumerate(lines,1) ])

Buradaki temel fikir, komut dosyası girdisini stdin aracılığıyla vermek (kabuğun yönlendirmesini kullanarak <, bir boru da kullanılabilir). Komut dosyası, alanları ayırmak için sekmeler kullanır, ancak boşluklar daha "ince ayarlanmış" bir çıktı için de kullanılabilir.

OP tarafından sağlanan giriş örneğini kullanan örnek çıktı:

$ python -c 'import sys;print "Filename\tStatus\tTimestamp";                                   
> lines=[l.strip() for l in sys.stdin];
> print "".join([l+"\n" if i%3 == 0 else l+"\t" for i,l in enumerate(lines,1) ])' < input.txt
Filename    Status  Timestamp
abc.txt errorstatus1    Fri Nov 11 02:00:09 2016
def.txt errorstatus2    Sat Nov 12 03:00:09 2016
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.