Saya punya file dengan kolom. Lihat di bawah untuk contoh:
a b c ... z
1 2 3 ... 26
Saya ingin menukar semua kolom di mana 1 menjadi yang terakhir, yang kedua menjadi yang sebelumnya ... dll.
z y x ... a
26 25 24 ... 1
Apakah ada satu liner ( awk
atau sed
) yang melakukan ini?
Saya tahu seseorang dapat menggunakan awk
ketika hanya ada beberapa kolom, tetapi saya ingin dapat melakukan ini pada file dengan ribuan kolom.
tac
melakukan ini dengan sempurna untuk baris.
Saya kira saya sedang mencari yang setara untuk kolom.
rev
tidak berfungsi untuk saya, karena juga menukar konten di kolom.
text-processing
sed
awk
columns
pengguna22519
sumber
sumber
perl -lane 'print join " ", reverse @F'
Jawaban:
sumber
Anda bisa melakukannya dengan skrip python kecil:
sumber
Jika Anda tidak keberatan dengan python maka one-liner ini akan membalik urutan kolom yang dipisahkan spasi di setiap baris:
Di atas juga berfungsi dengan python2.7:
sumber
Salah satu cara menggunakan
awk
.Isi dari
infile
:Jalankan
awk
perintah berikut :Dengan hasil sebagai berikut:
sumber
Ini lambat, tetapi memang memiliki satu fitur penukaran. Ini mempertahankan lebar pemisah bidang, ketika mereka lebih lebar dari satu karakter. FWIW: Jika Anda menjalankan skrip ini dua kali, hasilnya identik dengan aslinya.
Ini skripnya.
Berikut adalah beberapa perbandingan waktu. File tes berisi 1 baris.
sumber
Anda dapat menggunakan
tac
Anda hanya perlu mengubah input sebelum dan sesudah. Ini dapat dilakukan dengan kalkulator spreadsheetsc
dan sahabat karibnyapsc
:Seperti yang terlihat di sini .
Ini bekerja paling baik ketika semua kolom diisi.
infile
sampah
Edit
Seperti dicatat oleh PeterO
sc
memiliki batas keras 702 kolom, sehingga itu adalah ukuran maksimum yang didukung oleh metode ini.sumber
1
->1.00
. Juga, saya mendapatkan kesalahan untuk garis lebih dari 702 bidang. Tampaknya berhubungan dengan batas numerik 32.768 ... tapi ini cukup cepat, asis.-S
kepsc
perintah harus menginterpretasikan segala sesuatu sebagai string. Sehubungan dengan batas kolom 702, itu adalah batas yang sulit karena hanya kolom A sampai ZZ yang didukung (26 + 26 * 26), saya akan menambahkan komentar tentang itu.Saluran pipa ini lebih cepat daripada jawaban tercepat lainnya oleh faktor yang signifikan (lihat hasil). Ini menggunakan
tr
dantac
. Itu perlu menggunakan 2 ASCII byte (\ x00- \ x7F) yang tidak ada dalam data Anda.\x00
biasanya merupakan pilihan yang baik\x01
, tetapi Anda dapat menggunakan byte ASCII apa pun yang tidak ada dalam data.Dalam contoh ini, SPACE dan TAB sebagai karakter pembatas. Pembatas bisa multi-byte atau tunggal. Pembatas output adalah ruang tunggal.
Ini perintahnya. Nama file menunjukkan
numberof fields
_xnumber of lines
Jika Anda ingin / perlu memeriksa byte yang tidak digunakan, Anda dapat memeriksa terlebih dahulu dengan
awk
skrip opsional ini . Waktu keseluruhan, bahkan ketika menjalankan skrip opsional ini, masih jauh lebih cepat daripada metod lainnya (sejauh ini :) .. Berikut adalah skrip pra-pemrosesan.Ini skrip awk:
char-ascii-not-in-stream
Set waktu kedua, untuk skrip ini, termasuk
char-ascii-not-in-stream
waktu.sumber
Anda juga dapat melakukannya tanpa mencetak f :
sumber