Baris ke konversi kolom file

15

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.

yisha
sumber
Jika file Anda terdiri dari lebih dari satu baris dan output Anda karenanya harus memiliki lebih dari satu kolom, maka cobalah skrip AWK ini .
Dijeda sampai pemberitahuan lebih lanjut.
Pertanyaan yang sangat terkait: askubuntu.com/q/461144/295286
Sergiy Kolodyazhnyy

Jawaban:

20

Dengan menggunakan tr, ganti setiap karakter spasi berulang ( ) dengan satu \nkarakter baris baru ( ).

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

Tapi saya pikir Anda menginginkan sesuatu seperti ini?

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.

αғsнιη
sumber
Saya mencoba dengan data dan kode yang sama, itu mencetak kolom terakhir sebagai catatan pertama seperti 4 d% dan kemudian catatan 2 1 a # dan seterusnya.
Abhinay
8

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
Avinash Raj
sumber
1
+1 untuk penggunaan kreatifgrep
Volker Siegel
8

Anda juga bisa menggunakan fmtperintah:

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

Dengan datamash GNU :

$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
cuonglm
sumber
datamashsepertinya alat terbaik untuk tugas itu, tetapi menarik berapa banyak alat lain yang bisa digunakan!
Mark Stewart
6

Anda juga dapat melakukan ini menggunakan sed:

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

CATATAN: Tidak menangani situasi di mana kata-kata mengandung spasi.

slm
sumber
Ini membutuhkan sed GNU, sebaik yang saya tahu. Yang dikirimkan dengan mac (BSD) tidak melihat \nsebagai baris baru
D. Ben Knoble
5

Menggunakan awk, mengatur pemisah bidang keluaran ( OFS) sebagai pemisah rekaman (baris) ( RS):

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

Menggunakan forloop:

for val in `cat file1` ; do echo $val >> file2; done;
Mandar Shinde
sumber
0

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
Vaibhav Shetye
sumber
0

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
Sergiy Kolodyazhnyy
sumber
0

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
agc
sumber
0

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
Saumyakanta Sahoo
sumber
-1
awk '{for (i=1;i<=NF;i++) {print($i)}}' file > File2
Narmatha
sumber