Soru Unix'te her satırın sonuna metin ekleme


Belli metin işlemlerini yapıyorum ve sonunda böyle bir dosya alabiliyorum

india
sudan
japan
france

şimdi son dosyada olduğu gibi yukarıdaki dosyaya bir yorum eklemek istiyorum gibi bir şey olmalı

india | COUNTRY
sudan | COUNTRY
japan | COUNTRY
france | COUNTRY

tüm dosyada aynı yorumu beğendim. Bunu nasıl yaparım?


24
2018-04-15 08:55


Menşei


Eklemek istermisin | COUNTRY Daha önce metin gerçekten ülke isimleri ise? : D: D - Kent
hayır hayır böyle değil .. Belirli bir veri kümesini çıkardım ve tam olarak ne olduğunu biliyorum. Sadece bir yorum eklemek zorundayım :) - user2647888
Şaka yapıyordum ... ama eğer metin sizin tarafınızdan çıkarılmışsa, comment metni çıkardığınızda. her neyse aşağıda iyi cevaplar var. - Kent


Cevaplar:


Birçok yolu var:

sed: değiştir $ Verilen metin ile (satır sonu).

$ sed 's/$/ | COUNTRY/' file
india | COUNTRY
sudan | COUNTRY
japan | COUNTRY
france | COUNTRY

awk: satırı ve verilen metni yazdırın.

$ awk '{print $0, "| COUNTRY"}' file
india | COUNTRY
sudan | COUNTRY
japan | COUNTRY
france | COUNTRY

Sonunda, saf olarak bash: Satır çizgiyi oku ve verilen metinle birlikte yazdır. Not açıklandığı gibi bu tavsiye edilmez Neden kötü uygulama olarak kabul edilen metni işlemek için bir kabuk döngüsü kullanıyor?

$ while IFS= read -r line; do echo "$line | COUNTRY"; done < file
india | COUNTRY
sudan | COUNTRY
japan | COUNTRY
france | COUNTRY

50
2018-04-15 08:56



1’de 3’e 1 ... - Kent
Tüm çözümler çalışır, hatların bir satır beslemesiyle sonlandığını varsayar ("\ n"). Carriage return ve line feed ("\ r \ n") ile Windows'tan gelen bir dosyam vardı ve satırın başında istediğiniz yorumu aldım. Sadece dos2unix ile dosyayı dönüştürdüm ve tüm çözümler iyi çalışıyor. - nephewtom
Tanrım, lütfen bu iş için asla ilk çözümü kullanmayın. Manüel okuma ve çizgi işlemesi oldukça verimsizdir ve içtenlikle kurbanı yedi masum yavru yapar. Ayrıca bkz. unix.stackexchange.com/a/169765/103120 - Blauhirn
@Blauhirn iyi bir nokta. Bu mesajı farklı zamanlardan geçirdim, hepsi de bu cevabı yazdıktan sonra. Buna göre güncellendi, teşekkürler. - fedorqui
@SopalajodeArrierez hayır, Bash yaklaşımıdır. Blauhirn'in yorumundan sonra İndirdim ve biraz daha bilgi eklendi. - fedorqui


Daha gizlenmiş bir yaklaşım için:

yes '| COUNTRY' | sed $(wc -l < file)q | paste -d ' ' file -

4
2018-04-15 14:26



Çok hoş! Eklerseniz space önce pipe argümanında yes, seçeneğe ihtiyacınız yok -d için paste. O zaman mükemmel! - 00prometheus
Bir yan notta, testlerimde paste Araç büyük (> 20MB) test dosyaları için bile çok hızlı. - Sopalajo de Arrierez


Bir diğeri awk

awk '$0=$0" | COUNTRY"' file

3
2018-04-15 09:18



Bunu da düşündüm, bu en kısa awk çözümü olabilir ... +1 - Kent
Sadece eğlence için, 20M satırlık bir dosyayla performansı karşılaştırdım. time awk '{print $0, "| COUNTRY"' a &>/dev/null 0,003s alırken, time awk '$0=$0" | COUNTRY"' a &>/dev/null 4.03 civarında. Ödevin daha fazla zaman harcadığını tahmin ediyorum. - fedorqui
@fedorqui İlginç. Kısalık her zaman en iyisi değildir :) - Jotne
@Jotne, ben böyle bir sonuç beklemiyordum. Ama tabi ki, bu bir kenar durumdur ve cevabınız kesinlikle geçerlidir. - fedorqui
Bunu düzgün şekilde çalıştırmıyorum. Hattın başında COUNTRY ... Neden böyle? - nephewtom


Ayrıca kullanabilirsiniz xargs ile echo bunun için:

xargs -d "\n" -rI % echo '% | COUNTRY'

Bu yapacak xargs Her bir giriş satırını al ve belirtilen bir zamanda echo komut, yerine % Giriş çizgisiyle (veya seçtiğiniz herhangi bir karakter).

† Varsayılan olarak xargs Birden çok girdi satırını tek bir komutla geçirecek ve hepsini bağımsız değişken listesine ekleyecektir. Ama belirterek -I % markaları xargs girdiyi komutta belirtilen yere koyun ve sadece bir satırı orada bir seferde koyun. echo gerektiği kadar kez.


1
2018-03-08 10:20