Bagaimana cara mengubah dari baris ke kolom?


11

Saya memiliki file .txt dengan nomor yang dipesan seperti ini (pada baris yang sama):

106849_01373    106849_01967    106850_00082    23025.7_01059   

Saya ingin mengonversinya seperti itu:

106849_01373
106849_01967
106850_00082
23025.7_01059

Saya tidak tahu perintah mana yang harus digunakan. Dapatkah seseorang membantu saya dengan ini?

Jawaban:


5

Inilah satu dengan xargs

xargs -n1 < file.txt

Demo:

$ cat file.txt                    
106849_01373    106849_01967    106850_00082    23025.7_01059 

$ xargs -n1 < file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059

1
xargs adalah alat yang hebat, dan Jika Anda tidak menyebutkannya, saya akan melakukannya, tetapi ia memiliki satu kelemahan karena jika Anda menghilangkan perintah itu menggantikan gema (yang tidak seperti di beberapa shell, xargs tidak memiliki gema bawaan) dan -n1 memberi tahu xargs untuk memanggil perintah untuk setiap arg, jadi dengan contoh ini Anda harus melibatkan minimal enam proses (shell untuk melakukan pengalihan io, xargs, dan empat gema). Ini tidak begitu buruk pada lingkup ini, tetapi itu terukur lebih lambat pada beberapa ribu garis keluaran.
Hildred

16

Cukup mudah dengan tr:

tr -s '[:blank:]' '\n' <file.txt

Contoh:

% cat file.txt                    
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   

% tr -s '[:blank:]' '\n' <file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059

2

jawaban heemayl adalah cara untuk pergi, namun inilah alternatif menggunakan Perl:

perl -lane '$,="\n"; print(@F)' file.txt
  • -l: mengaktifkan pemrosesan akhir baris otomatis. Ini memiliki dua efek terpisah. Pertama, secara otomatis chomps $ / (pemisah rekaman input) saat digunakan dengan -n atau -p. Kedua, ia menetapkan $ \ (pemisah catatan output) untuk memiliki nilai octnum sehingga setiap pernyataan cetak akan memiliki pemisah yang ditambahkan kembali. Jika octnum dihilangkan, tetapkan $ \ ke nilai saat ini $ /.
  • -a: mengaktifkan mode autosplit saat digunakan dengan -n atau -p. Perintah split implisit ke array @F dilakukan sebagai hal pertama di dalam loop implisit saat diproduksi oleh -n atau -p.
  • -n: menyebabkan Perl untuk mengasumsikan loop berikut di sekitar program Anda, yang membuatnya iterate atas argumen nama file agak seperti sed -n atau awk:

    LINE:
      while (<>) {
          ...             # your program goes here
      }
  • -e: dapat digunakan untuk memasukkan satu baris program;

  • $,="\n": mengatur pemisah bidang keluaran ke baris baru;
  • print(@F): mencetak bidang yang dipisahkan oleh pemisah bidang keluaran.
% cat file.txt
106849_01373    106849_01967    106850_00082    23025.7_01059 
% perl -lane '$,="\n"; print(@F)' file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059

1

AWKpendekatan. Pada dasarnya mengubah pemisah output untuk bidang, dan perulangan. File uji adalah contoh Anda yang ditempel berulang-ulang dengan ENDLINE di bagian akhir

$ awk 'BEGIN{OFS="\n"}{for(i=1;i<=NF;i++) print $i}' some_data 
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE

1

Menggunakan sed:

sed -e 's/\s\{1,\}$//' -e 's/\s\+/\n/g' file.txt > split_file.txt

Tidak cukup..itu akan menambahkan baris tambahan setelah setiap baris (awal) ..
heemayl

Periksa dengan beberapa baris, Anda akan mendapatkan
kasing yang

Bisakah Anda menambahkan contoh dengan jawaban Anda ..
heemayl

@heemayl Anda bermaksud akan mengubah spasi tambahan menjadi baris baru. Sintaks Anda tidak membuatnya mudah dimengerti. : /
techraf

1

Saya hanya menambahkan solusi Python untuk bersenang-senang:

python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile

Perintah ini menjalankan skrip Python 3 baris satu dalam 'tanda kutip tunggal' dengan nama file yang ingin Anda konversi sebagai argumen pada akhirnya. Sintaksnya seperti ini:

python3 -c 'PYTHON_COMMAND_OR_1-LINE-SCRIPT' ARGUMENTS

Skrip 1-baris yang kami gunakan adalah ini (diperluas ke beberapa baris untuk kejelasan):

import sys
f=open(sys.argv[1])
print(*f.read().split(),sep="\n")

Itu mengimpor sysmodul untuk membaca argumen baris perintah, mengambil argumen pertama yang diberikan sebagai nama file untuk membuka dan mencetak setiap potongan data yang dipisahkan spasi putih dari file dalam satu baris.

$ cat mytestfile 
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   

$ python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
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.