Birden çok çıktı satırını bir satıra birleştirmek nasıl?


158

Komutu çalıştırırsam, cat file | grep patternbirçok çıktı satırı alırım. Nasıl etkili her yerine bir satır içine tüm satırları ard arda "\n"ile "\" "(birlikte sonuna "boşluk bulunduğunda)?

cat file | grep pattern | xargs sed s/\n/ /g benim için çalışmıyor.


Bu arada: (1) sedBash'in onunla uğraşmaması için komut dosyanızı tek tırnak içine almanız gerekir (çünkü iki argümanla sed s/\n/ /gçağrılar sed, s/n/ve /g); (2) Eğer çıktısını istediğiniz beri cat file | grep patternolmayı giriş için seddeğil, argümanlar için sedsize ortadan kaldırmak gerekir, xargs; ve (3) dosyaya gerek yoktur cat, çünkü grepikinci argüman olarak bir dosya adı alabilir. Yani, denemeliydin grep pattern file | sed 's/\n/ /g'. (Bu durumda, yukarıdaki bağlantıda verilen nedenlerden dolayı işe
yaramazdı


Soru 68 oy (140 bin görüntülenme) ile çoğaltılan 1 oy (12 bin görüntülenme) sonrası? Bu doğru değil.
kenorb

Yanıtlar:


231

tr '\n' ' 'Tüm yeni satır karakterlerini boşluklara çevirmek için kullanın :

$ grep pattern file | tr '\n' ' '

Not: grepdosyaları okur, dosyaları catbirleştirir. Yapma cat file | grep!

Düzenle:

tryalnızca tek karakterlik çevirileri işleyebilir. awkÇıkış kayıt ayırıcısını aşağıdaki gibi değiştirmek için kullanabilirsiniz :

$ grep pattern file | awk '{print}' ORS='" '

Bu dönüşecek:

one
two 
three

için:

one" two" three" 

3
Bu yaklaşımla sonunda istenmeyen bir alanla bitiyorsunuz.
sorin

1
Bilgi echo ""istemi metninden önce yeni satır eklemek için sonunda eklemeniz gerekir .
nexayq

1
Bu güzel çalışıyor, ancak ayırıcı son girişte görünmesini istemiyorum. Örnek olarak, sizin "gibi görünür one" two" three", ancak bunun gibi görünmesini isterdim one" two" three. Son üçünde parantez olmadığını unutmayın. Herhangi bir fikir?
oink

2
@oink sed '$s/..$//', son satırdaki son 2 karakteri silmek için sonuçları aktarabilirsiniz .
Chris Seymour

3
Yeni satırları hiçbir şeyle değiştirmek istemiyorsanız, bu --deleteseçeneği varsayılan olarak iki bağımsız değişken beklediği için kullanmanız gerekir . örn tr --delete '\n'.
Elijah Lynn

69

Çıktı xargsboruları, her çıktı satırını boşluklu tek bir satıra birleştirir:

grep pattern file | xargs

Veya herhangi bir komut, ör. ls | xargs. Varsayılan xargsçıkış sınırı ~ 4096 karakterdir, ancak örn. xargs -s 8192.


| tr '\n' ' 'php execişlevi üzerinden çağrıldığında benim için çalışmıyor . Tr'i görmezden geliyordu ve sadece grep'ten son maçı veriyordu. | xargsçalıştı.
Adarsha

3
Bu çözüm aynı zamanda girdiden boşluk 'yemesi' avantajına da sahiptir. +1
Rene

55

Bash echotırnak işaretleri olmadan satırbaşları, sekmeler ve çoklu boşlukları kaldırın

echo $(cat file)

8
Burada oldukça önemsiz bir cevap, bu gerçekten basit ve bir çizgi gibi bir cazibe gibi çalışır.
Dangercrow

Bu özellikle kullanırsanız IFS="$(printf '\n\t')"
aggol

5
Ya da sadece echo $(<file)... yankı kullanmak sadece kullanmaktan daha temiz değil tr '\n' ' ', aynı zamanda daha iyidir ( \r\nsatır sonlarını düşünün ). @aggsol diyebilirsinizIFS=$'\n\t'
Normadize

Boşluksuz nasıl olur?
DimiDak

22

İstediğin bu olabilir

cat file | grep pattern | paste -sd' '

Düzenlemenize gelince, bunun ne anlama geldiğinden emin değilim, belki de bu?

cat file | grep pattern | paste -sd'~' | sed -e 's/~/" "/g'

(Bu varsayar ~oluşmaz file)


2
@Stephan bunun, hatta bir dosya cat fileolacağını varsaymaya gerek yoktu cat. (
Soruyla

5

Bu virgülle ayrı çıktılar üreten bir örnektir. Virgül, ihtiyacınız olan ayırıcıyla değiştirebilirsiniz.

cat <<EOD | xargs | sed 's/ /,/g'
> 1
> 2
> 3
> 4
> 5
> EOD

üretir:

1,2,3,4,5

3

exEditör ( Vim'in bir parçası ) kullanan yöntem :

  • J tüm hatlar ve Oin s standart çıktıya rint:

    $ ex +%j +%p -scq! file
  • J (dosyasında) tüm hatlar yerinde Oin:

    $ ex +%j -scwq file

    Not: Bu dosya içindeki tüm satırları birleştirecektir!


2

Bu sorunu çözmenin en hızlı ve en kolay yolları:

Yeni çizgi karakterini \n boşlukla değiştirmek istediğimizde :

xargs < file

xargssatır başına karakter sayısı ve birleştirilen tüm karakterlerin sayısı üzerinde kendi sınırları vardır, ancak bunları artırabiliriz. Ayrıntılar bu komutu çalıştırarak bulunabilir: xargs --show-limitsve elbette kılavuzda:man xargs

Bir karakteri başka bir tam karakterle değiştirmek istediğimizde :

tr '\n' ' ' < file

Bir karakteri birden çok karakterle değiştirmek istediğimizde :

tr '\n' '~' < file | sed s/~/many_characters/g

İlk olarak, \ntildes için yeni satır karakterlerini değiştiririz ~(veya metinde bulunmayan başka bir benzersiz karakteri seçeriz ) ve sonra tilde karakterlerini başka herhangi bir karakterle ( many_characters) değiştiririz ve bunu her tilde (bayrak g) için yaparız .


0

Muhtemelen bunu yapmanın en iyi yolu, bir satıra çıktı oluşturacak 'awk' aracını kullanmaktır

$ awk ' /pattern/ {print}' ORS=' ' /path/to/file

Tüm satırları boşluk sınırlayıcı ile birleştirir


{print}Çünkü awk varsayılan eylem gerekmez .
stark

0

İşte başka bir basit yöntem kullanarak awk:

# cat > file.txt
a
b
c

# cat file.txt | awk '{ printf("%s ", $0) }'
a b c

Ayrıca, dosyanızda sütunlar varsa, bu yalnızca belirli sütunları birleştirmek için kolay bir yol sağlar:

# cat > cols.txt
a b c
d e f

# cat cols.txt | awk '{ printf("%s ", $2) }'
b e

-1

Kırmızı şapka linux üzerinde sadece yankı kullanıyorum:

echo $ (cat / some / file / name)

Bu bana bir dosyanın tüm kayıtlarını tek bir satırda verir.


2
Bu, 2015 yılında zaten yanıtlanmış gibi. Bu yanıtı tekrarlıyorsunuz . Kendi sorularınızı göndermeden önce, özellikle soru 7 yaşında ve zaten 8 cevap olduğunda lütfen cevapları okuyun.
Mickael B.
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.