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.
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.
Yanıtlar:
Kullanarak tr
, yinelenen her boşluk karakterini ( ) tek bir yeni satır (
\n
) karakteriyle değiştirin.
tr -s ' ' '\n'< infile > outfile
1 2 3 4 1 a # abcd -> 2 b $ # $ @% 3 c @ % 4 gün
İle awk
yapabiliriz:
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 END
ilk 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.
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
grep
Ayrıca şu fmt
komutu da kullanabilirsiniz :
~$ cat f
PAPER TEAM MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
İle GNU datamash :
$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
datamash
görev için en iyi araç gibi görünüyor, ancak başka kaç araç kullanılabileceği büyüleyici!
Bunu kullanarak şunları da yapabilirsiniz sed
:
$ sed -e 's/ */\n/g' file1 > file2
NOT: Kelimelerin boşluk içerdiği durumu ele almaz.
\n
yeni satır olarak görünmüyor
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
Bir for
döngü kullanma :
for val in `cat file1` ; do echo $val >> file2; done;
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
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.txt
ve yeniden yönlendirme output.txt
kullanmaya 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
Kullanarak xargs
, ( souravc'ın cevabından çalınmış ):
xargs -n 1 < File1 > File2
Veya küçük bir yeniden biçimlendirme gerekirse, printf
biçim dizelerini gerektiği gibi kullanın :
xargs printf '%s\n' < File1 > File2
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