Satırdan sütuna dönüştürme


15

Bir dosyam olduğunu varsayalım:

file1:

PAPER  TEAM  MANISH NISHA GARIMA JYOUTI ........etc 

İstediğim Dosya2:

PAPER    
TEAM
MANISH
NISHA
GARIMA    
JYOUTI

Dosya1'in satırdan sütuna dönüştürülmesi.


Dosyanız birden fazla satırdan oluşuyorsa ve çıktılarınızda birden fazla sütun olması gerekiyorsa, bu AWK komut dosyasını deneyin .
sonraki duyuruya kadar duraklatıldı.

Yanıtlar:


20

Kullanarak tr, yinelenen her boşluk karakterini ( ) tek bir yeni satır ( \n) karakteriyle değiştirin.

tr -s ' '  '\n'< infile > outfile

Ama bence böyle bir şey mi istiyorsun?

1 2 3 4 1 a #
abcd -> 2 b $
# $ @% 3 c @
                % 4 gün

İle awkyapabiliriz:

awk '{ for (i=1; i<=NF; i++) RtoC[i]= (RtoC[i]? RtoC[i] FS $i: $i) } 
    END{ for (i in RtoC) print RtoC[i] }' infile

Bu, her dosyalanmış sayı pozisyonunu birleştirir ve ENDilk sütunda ilk satır, ikinci sütunda ikinci satır, vb. Olacak sonucu yazdırır. Tabii ki, giriş dosyası hafıza boyutunuzla sınırlıdır.


Aynı veri ve kod ile denedim, ilk sütun 4 d% ve sonra 2. kayıt 1 a # ve benzeri gibi son sütun yazdırdı.
Abhinay

8

Bunu grep ile yapabilirsiniz. Varsayılan olarak grep, maçı ayrı bir satırsonu olarak yazdırır.

grep -oP '\S+' infile > outfile

VEYA

grep -o '[^[:space:]]\+' infile > outfile

1
Yaratıcı kullanım için +1grep
Volker Siegel

8

Ayrıca şu fmtkomutu da kullanabilirsiniz :

~$ cat f
PAPER  TEAM  MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI

7

İle GNU datamash :

$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI

datamashgörev için en iyi araç gibi görünüyor, ancak başka kaç araç kullanılabileceği büyüleyici!
Mark Stewart

6

Bunu kullanarak şunları da yapabilirsiniz sed:

$ sed -e 's/  */\n/g' file1 > file2

NOT: Kelimelerin boşluk içerdiği durumu ele almaz.


Bu, söyleyebildiğim kadarıyla GNU sed gerektirir. Mac (BSD) ile gelen kişi \nyeni satır olarak görünmüyor
D.Ben Knoble

5

Kullanılması awk, çıkış alanı ayırıcı (ayar OFS(kayıt olarak) (çizgi) ayırıcı RS):

awk '{OFS=RS;$1=$1}1' file > file2

2

Bir fordöngü kullanma :

for val in `cat file1` ; do echo $val >> file2; done;

0

Ayrıca kullanmayı deneyebilirsiniz sed

$ sed -i.bak s@' '@'\n'@g infile.txt

@İkame işlemi için ayırıcı olarak kullandığımı lütfen unutmayın . Bu ayrıca bir yedekleme dosyası oluşturur. Yedeklemeye ihtiyacınız yoksa .bak kaldır

$ sed -i s@' '@'\n'@g infile.txt

0

Python sürümü:

python -c "import sys;lines=[l.replace(' ','\n') for l in sys.stdin.readlines()];print(''.join(lines))" < input.txt > output.txt

Bu, <Python'un stdin'ine yeniden yönlendirme kullanır input.txtve yeniden yönlendirme output.txtkullanmaya yazar >. Tek satırın kendisi tüm satırlarda stdin, tüm boşlukların yeni satırlarla değiştirildiği bir dizeler listesine okur ve .join()işlevi kullanarak tüm metni yeniden oluştururuz .

Serideki birden çok boşluğun yeni satırlarla değiştirilmesini önlemek için alternatif yaklaşım, .split()satırı sözcük listesine bölmek için kullanmaktır . Bu şekilde, her kelimenin yalnızca bir satırsonu ile ayrılmasını sağlayabiliriz

python -c "import sys;lines=['\n'.join(l.strip().split()) for l in sys.stdin.readlines()];print('\n'.join(lines))" < input.txt > output.txt

0

Kullanarak xargs, ( souravc'ın cevabından çalınmış ):

xargs -n 1 < File1 > File2

Veya küçük bir yeniden biçimlendirme gerekirse, printfbiçim dizelerini gerektiği gibi kullanın :

xargs printf '%s\n' < File1 > File2

0

Benim çözümüm:

#!/bin/bash
cols=$(head -1 file.txt | wc -w)
for i in $(seq 1 $cols); do
cut -d ' ' -f$i file.txt | tr '\n' ' ' | sed s'/.$//'
echo
done

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.