Nasıl satırdan sütuna dönüştürmek için?


11

(Aynı satırda) bu şekilde sipariş edilen numaralarla bir .txt dosyası var:

106849_01373    106849_01967    106850_00082    23025.7_01059   

Onları bu şekilde dönüştürmek istiyorum:

106849_01373
106849_01967
106850_00082
23025.7_01059

Hangi komutu kullanacağım hakkında hiçbir fikrim yok. Birisi bana bununla ilgili yardım edebilir mi?

Yanıtlar:


5

İşte biri xargs

xargs -n1 < file.txt

Demo:

$ cat file.txt                    
106849_01373    106849_01967    106850_00082    23025.7_01059 

$ xargs -n1 < file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059

1
xargs harika bir araçtır ve eğer bahsetmemiş olsaydınız, olurdu, ama komutu atlarsanız, echo yerine geçer (ki bazı kabuklardan farklı olarak, xargs yerleşik bir ekoya sahip değildir) ve -n1, xargs'a her arg için komutu çağırmasını söyler, bu nedenle bu örnekle en az altı işleminiz olur (io yeniden yönlendirmesi yapmak için kabuk, xargs ve dört echos). Bu, bu kapsamda o kadar da kötü değil, ancak birkaç bin satırlık çıktıda ölçülebilir derecede daha yavaş.
Hildred

16

İle oldukça kolay tr:

tr -s '[:blank:]' '\n' <file.txt

Misal:

% cat file.txt                    
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   

% tr -s '[:blank:]' '\n' <file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059

2

heemayl'ın cevabı gitmenin yoludur, ancak Perl'i kullanan bir alternatif:

perl -lane '$,="\n"; print(@F)' file.txt
  • -l: otomatik satır sonu işlemeyi etkinleştirir. İki ayrı etkisi vardır. İlk olarak, -n veya -p ile kullanıldığında $ / (giriş kayıt ayırıcısı) otomatik olarak keser. İkincisi, $ \ (çıkış kaydı ayırıcısı) octnum değerine sahip olur, böylece herhangi bir yazdırma ifadesi bu ayırıcıyı tekrar ekler. Oktnum atlanırsa, $ \ değerini geçerli $ / değerine ayarlar.
  • -a: -n veya -p ile kullanıldığında otomatik bölme modunu açar. @F dizisine örtük bir split komutu, -n veya -p tarafından üretilen örtük while döngüsü içinde ilk şey olarak yapılır.
  • -n: Perl'in programınızın etrafında aşağıdaki döngüyü almasına neden olur, bu da onu sed -n veya awk gibi dosya adı bağımsız değişkenleri üzerinde yineleyerek yapar:

    LINE:
      while (<>) {
          ...             # your program goes here
      }
  • -e: bir program satırı girmek için kullanılabilir;

  • $,="\n": çıkış alanı ayırıcısını yeni satıra ayarlar;
  • print(@F): çıkış alanı ayırıcısıyla ayrılmış alanları yazdırır.
% cat file.txt
106849_01373    106849_01967    106850_00082    23025.7_01059 
% perl -lane '$,="\n"; print(@F)' file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059

1

AWKyaklaşmak. Temelde alanlar için çıkış ayırıcısını değiştirme ve döngü. Test dosyası, sonunda ENDLINE ile yapıştırılmış örneğinizdir

$ awk 'BEGIN{OFS="\n"}{for(i=1;i<=NF;i++) print $i}' some_data 
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE

1

Kullanma sed:

sed -e 's/\s\{1,\}$//' -e 's/\s\+/\n/g' file.txt > split_file.txt

Pek değil .. her (ilk) satırdan sonra bir satırsonu ekleyecektir ..
heemayl

Birden fazla hat ile kontrol edin, o zaman net bir durum elde edersiniz ..
heemayl

Cevabınızla ilgili bir örnek verebilir misiniz ..
heemayl

@heemayl Sondaki boşlukları yeni satırlara çevirmek istediniz. Sözdiziminiz anlaşılmasını kolaylaştırmaz. : /
techraf

1

Sadece eğlence için bir Python çözümü ekliyorum:

python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile

Bu komut, tek satırlı Python 3 komut dosyasını 'tek tırnak' içinde sonunda bağımsız değişken olarak dönüştürmek istediğiniz dosya adıyla çalıştırır. Sözdizimi şöyle:

python3 -c 'PYTHON_COMMAND_OR_1-LINE-SCRIPT' ARGUMENTS

Kullandığımız 1 satırlık komut dosyası şudur (netlik için birden çok satıra genişletilmiştir):

import sys
f=open(sys.argv[1])
print(*f.read().split(),sep="\n")

sysKomut satırı bağımsız değişkenlerini okumak için modülü alır, ilk verilen bağımsız değişkeni açmak için dosya adı olarak alır ve boşlukla ayrılmış her veri yığınını dosyadan tek bir satırda yazdırır.

$ cat mytestfile 
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   

$ python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
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.