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.


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.


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

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

7

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!
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.


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


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

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

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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.