Misalkan saya punya file:
File1:
PAPER TEAM MANISH NISHA GARIMA JYOUTI ........etc
File2 yang saya inginkan:
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
Baris ke konversi kolom File1.
Misalkan saya punya file:
File1:
PAPER TEAM MANISH NISHA GARIMA JYOUTI ........etc
File2 yang saya inginkan:
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
Baris ke konversi kolom File1.
Jawaban:
Dengan menggunakan tr, ganti setiap karakter spasi berulang ( ) dengan satu \nkarakter baris baru ( ).
tr -s ' ' '\n'< infile > outfile
1 2 3 4 1 a #
abcd -> 2 b $
# $ @% 3 c @
4 d%
Dengan awkkita bisa melakukan:
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
Ini menggabungkan setiap posisi nomor yang diajukan menjadi satu dan ENDmencetak hasil yang akan menjadi baris pertama di kolom pertama, baris kedua di kolom kedua, dll. Tentu saja file input terbatas pada ukuran memori Anda.
Anda bisa melakukannya melalui grep. Secara default grep, akan mencetak kecocokan di baris baru yang terpisah.
grep -oP '\S+' infile > outfile
ATAU
grep -o '[^[:space:]]\+' infile > outfile
grep
Anda juga bisa menggunakan fmtperintah:
~$ cat f
PAPER TEAM MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
Dengan datamash GNU :
$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
datamashsepertinya alat terbaik untuk tugas itu, tetapi menarik berapa banyak alat lain yang bisa digunakan!
Anda juga dapat melakukan ini menggunakan sed:
$ sed -e 's/ */\n/g' file1 > file2
CATATAN: Tidak menangani situasi di mana kata-kata mengandung spasi.
\nsebagai baris baru
Menggunakan awk, mengatur pemisah bidang keluaran ( OFS) sebagai pemisah rekaman (baris) ( RS):
awk '{OFS=RS;$1=$1}1' file > file2
Menggunakan forloop:
for val in `cat file1` ; do echo $val >> file2; done;
Anda juga dapat mencoba menggunakan sed
$ sed -i.bak s@' '@'\n'@g infile.txt
Harap dicatat bahwa saya menggunakan @sebagai pemisah untuk operasi penggantian. Ini juga akan membuat file cadangan. Jika Anda tidak membutuhkan cadangan, hapus .bak
$ sed -i s@' '@'\n'@g infile.txt
Versi python:
python -c "import sys;lines=[l.replace(' ','\n') for l in sys.stdin.readlines()];print(''.join(lines))" < input.txt > output.txt
Ini menggunakan <pengalihan ke stdin python dari input.txtdan menulis untuk output.txtmenggunakan >pengalihan. One-liner itu sendiri membaca di semua baris dari stdindaftar string, di mana semua spasi diganti dengan baris baru, dan kami membangun kembali seluruh teks menggunakan .join()fungsi.
Pendekatan alternatif untuk menghindari beberapa spasi dalam rangkaian yang diganti dengan baris baru adalah dengan menggunakan .split()untuk memecah baris menjadi daftar kata. Dengan begitu, kami dapat memastikan bahwa setiap kata hanya dipisahkan oleh satu baris baru
python -c "import sys;lines=['\n'.join(l.strip().split()) for l in sys.stdin.readlines()];print('\n'.join(lines))" < input.txt > output.txt
Menggunakan xargs, (dicuri dari jawaban souravc ):
xargs -n 1 < File1 > File2
Atau jika pemformatan ulang minor diperlukan, gunakan printfformat string yang mungkin diperlukan:
xargs printf '%s\n' < File1 > File2
Solusi saya adalah:
#!/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