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
\n
karakter baris baru ( ).
tr -s ' ' '\n'< infile > outfile
1 2 3 4 1 a # abcd -> 2 b $ # $ @% 3 c @ 4 d%
Dengan awk
kita 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 END
mencetak 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 fmt
perintah:
~$ 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
datamash
sepertinya 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.
\n
sebagai baris baru
Menggunakan awk
, mengatur pemisah bidang keluaran ( OFS
) sebagai pemisah rekaman (baris) ( RS
):
awk '{OFS=RS;$1=$1}1' file > file2
Menggunakan for
loop:
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.txt
dan menulis untuk output.txt
menggunakan >
pengalihan. One-liner itu sendiri membaca di semua baris dari stdin
daftar 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 printf
format 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