bash / sed / awk / etc diğer tüm satırları kaldır


39

bir bash komutları şunu verir:

Runtime Name: vmhba2:C0:T3:L14
Group State: active
Runtime Name: vmhba3:C0:T0:L14
Group State: active unoptimized
Runtime Name: vmhba2:C0:T1:L14
Group State: active unoptimized
Runtime Name: vmhba3:C0:T3:L14
Group State: active
Runtime Name: vmhba2:C0:T2:L14
Group State: active

Bu şekilde görünmesi için bir şeye boru döşemek istiyorum:

Runtime Name: vmhba2:C0:T1:L14 Group State: active 
Runtime Name: vmhba3:C0:T3:L14 Group State: active unoptimized
Runtime Name: vmhba2:C0:T2:L14 Group State: active
[...]

yani diğer tüm yeni satırları kaldır

Denedim ... |tr "\nGroup" " "ama tüm yeni satırları kaldırdı ve diğer bazı harfleri de yedi. Teşekkürler


2
trtamamen karakter tabanlıdır: tr'den yeni satırları ve 'G', 'r', 'o', 'u' ve 'p' harflerini kaldırmasını istediniz.
glenn jackman

Yanıtlar:


80

şu anda test edemiyorum, ama

... | paste - - 

yapmalı


5
+1 - çalışıyor ve zarif. (Satırlar arasına bir sekme koyar - paste -d ' ' - -gerekirse bir boşluk ekler)
cyberx86 30.03

4
Komutun nasıl çalıştığını açıklayabilir misiniz? Neden iki tane var -? Teşekkürler
bbaja42

7
pastedosyalarından gelen satırları bitiştirmek için kullanılır: paste file1 file2 file3 .... "Dosya" argümanlarından biri "-" ise, satırlar standart girdiden okunur. 2 "-" argümanı varsa, yapıştır stdin'den 2 satır alır. Ve bunun gibi. Man sayfasına bakınız .
Glenn jackman

10

Bir olasılık:

awk 'ORS=NR%2?" ":"\n"'

Satır numarası 2 ile eşit olarak bölünebiliyorsa, yeni bir satırla bitirin, aksi takdirde boşlukla bitirin.

(Test edildi: CentOS 6, GNU Awk 3.1.7)

Sed kullanımı ( açıklamaya bakınız ):

sed ':a;N;$!ba;s/\nGroup/ Group/g'

Daha fazla okuma:


8

Kullanmak istiyorsanız sed, tüm dosyayı belleğe okumak için hiçbir neden yoktur. Diğer bütün satırları şöyle birleştirebilirsiniz:

sed 'N;s/\n/ /' inputfile

Boşluk yerine, istediğiniz herhangi bir karakteri kullanın.

İşte awk kullanmanın başka bir yolu:

awk '{printf "%s", $0; if (getline) print " " $0; else printf "\n"}' inputfile

if/elseKolları dosyadaki satırların bir tek sayı olduğu olgusu. Onsuz, garip son satır iki kez basılır. Aksi takdirde, karşılaştırma için şunları yapabilirsiniz:

awk '{printf "%s", $0; getline; print " " $0}'

1
Geç bir yorum: 1) dizgede yüzde işareti olması durumunda her zaman printf için bir format belirteci kullanın, 2) yinelenen son satırdan kaçınmak için $ 0 - "" -awk '{printf "%s", $0; $0=""; getline; print " " $0}'
glenn jackman

3

Bunu yapmanın en deyimsel yolu awkşudur:

awk 'ORS=NR%2?FS:RS' file

Çıktıları:

Runtime Name: vmhba2:C0:T3:L14 Group State: active
Runtime Name: vmhba3:C0:T0:L14 Group State: active unoptimized
Runtime Name: vmhba2:C0:T1:L14 Group State: active unoptimized
Runtime Name: vmhba3:C0:T3:L14 Group State: active
Runtime Name: vmhba2:C0:T2:L14 Group State: active

Bunu açıklamak için, yerleşik değişkenlerin her birini tanımlamamız gerekir:

  • RSkayıt ayırıcı. Varsayılan olarak \n(yeni satır).
  • ORSçıkış kayıt ayırıcısı. Varsayılan olarak \n(yeni satır).
  • FSalan ayırıcısı. Varsayılan olarak (boşluk).
  • NR kayıt sayısı.

Varsayılan kayıt ayırıcı yeni satır olduğundan, bir kayıt varsayılan olarak bir satırdır.

NR%2veya bu modül NR/2ya 0da öyle olacaktır 1. 0çift ​​çizgiler için ve 1tek çizgiler için.

var=condition?condition_if_true:condition_if_false üçlü operatör.

Hep birlikte, ORS=NR%2?FS:RSçıktı kayıt ayırıcısını tanımladığımızı söyleyerek :

  • eğer kayıt sayısı formda 2k + 1, yani hatta çizgilerdeyse, çıktı kayıt ayırıcıları FS, yani bir boşluğa ayarlanır .
  • eğer kayıt sayısı formda ise 2k, yani tek satırlarda ise, çıkış kayıt ayırıcılar RSyani yeni bir satıra ayarlanır .

Bu şekilde, tek çizgiler bir boşlukla sona erer, bu daha sonra bir sonraki çizgiyle birleştirilir. Bu satırdan sonra yeni bir satır yazdırılır.

Hakkında daha fazla bilgi Idiomatic awk .


2

Bu benim için Linux'ta çalışıyor:

... | tr "\\n" " "

Bu, yeni satır karakteri için boş bir alanı değiştirir; Eğer gereken şeyler doğru çalışması için satır karakteri kaçış.


Bu, her yeni satır, her kaldırır diğer satır.
Trenton

2

Bash:

... | while read l1; do read l2; echo "$l1 $l2"; done

1

Perl bir seçenek ise:

perl -pe 's/\n/ / if $. % 2 == 1' file

s/\n/ /newline ile boşluk değiştirir
$., satır numarasıdır


-1

Kullanmaya ne dersin grep?

.. | grep -v '^Group State'

Bu alternatif çizgileri ortadan kaldırır. OP onların eklenmesini istiyor.
Dennis Williamson,

Evet, soruyu tekrar okuduktan sonra farkettim ki :)
pkhamre
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.