Saya memiliki kerangka data berikut yang berlanjut secara tak terbatas secara horizontal dan vertikal dengan angka negatif hanya di kolom ganjil:
-1 2 3 4 -5 9
2 3 -4 5 -6 11
Dan saya ingin 2, 4 dan 6 kolom lengkap (atau setiap kolom genap) dan tanda minus hanya dari 1, 3, dan 5 (atau setiap kolom aneh), jadi saya mendapatkan ini:
- 2 4 - 9
3 - 5 - 11
Dan akhirnya berakhir dengan ini:
-2 4 -9
3 -5 -11
Jadi saya perlu nilai dari kolom genap tidak berubah dan kolom aneh, jika ada nilai negatif, pertahankan - saja dan jika ada nilai positif, buanglah.
Apakah ada cara untuk melakukan ini dengan awk / sed?
Ini tentang sejauh yang saya dapatkan:
awk '{ for (i=2;i<=NF;i+=2) $i="" }1' FILE.txt | sed 's/[0-9,.]*//g'
text-processing
sed
awk
Asfound
sumber
sumber
Jawaban:
Ini salah satu caranya:
The
awk
Script berjalan di atas semua kolom aneh dan menetapkan nilai mereka untuk-
jika mereka negatif dan mengosongkan jika tidak. Kemudian,sed
menghapus ruang apa pun setelah a-
dan kemudian menggantikan beberapa ruang berturut-turut dengan satu. Perhatikan bahwa ini berarti pelurusan akan rusak karena beberapa bidang akan memiliki dua karakter atau lebih dan yang lain akan memiliki satu. Itu tidak akan menjadi masalah jika Anda bekerja dengan bidang, mereka hanya tidak terlihat cantik.sumber
The
sed
cara:Keluaran:
Ekspresi pertama membunuh kolom tambahan jika ada jumlah kolom ganjil. Itu melakukannya dengan mencari 0 atau lebih pasangan
<number> <number>
, di mana angka pertama bisa negatif.Sunting:
sed
Solusi yang lebih pendek , terinspirasi oleh @mikeserv:Hal yang sama dengan
perl
:Cara lain dengan
perl
(mungkin yang terbersih):sumber
Satu
perl
:-an
pisahkan input ke@F
arrayBEGIN{$,=" "}
mengatur pemisah bidang keluaran ke spasigrep{!($_%2)}0..$#F
dapatkan semua indeks genap dalam@F
array, yang merupakan indeks elemen anehmap{$_=$F[$_]=~/^-/?"-$F[$_+1]":" $F[$_+1]"}
periksa apakah elemen aneh dimulai dengan-
, lalu tambahkan-
ke elemen genap berikutnya, atau tambahkan spasisumber
Sebagai jawaban @ terdon tetapi tanpa sed:
sumber
Sebuah
python
solusisumber
Solusi sederhana berbasis matematika
awk
:i=2
) ke bidang terakhir (i<=NF
).$(i-1)
) dengan -1 atau 1.printf "%4s"
), dan cetak baris tambahan (print ""
).Satu-satunya peringatan untuk ini adalah bahwa jika Anda memiliki jumlah kolom ganjil, bidang terakhir tidak akan menampilkan apa pun. Saya harap ini yang Anda harapkan.Ternyata inilah yang Anda harapkan. :)(diedit untuk bekerja dengan nilai desimal, dan untuk membuat kondisi loop lebih selaras dengan pertanyaan sambil menyimpan 2 karakter.)
sumber
Anda harus melupakan yang negatif sepenuhnya - tinggalkan saja. Anda ingin menggabungkan dua bidang - dari kiri ke kanan. Itu sangat mudah.
Perhatikan bagaimana saya menghindari referensi ke tanda sama sekali - ketika input diproses automaton hanya akan menerima spasi atau angka karena tidak mengerti apa-apa lagi - semuanya diabaikan sepenuhnya dan akan tetap berada di tempatnya.
Saat Anda menentukan
\{
interval pengulangan numerik\}
untuk\(
subekspresi\)
, hanya kemunculan terakhir dari ekspresi yang\1
direferensikan kembali. Jadi Anda bisa menekan - atau memotong - interval ulang yang mudah. Dan karena kita menekan pengulangan di belakang tanda - jika ada - kemunculan kedua dari pola itu akan mengikuti tanda apa pun yang digunakan untuk mendahului yang pertama.Perilaku yang dijelaskan di atas ditentukan oleh POSIX untuk semua aplikasi yang sesuai dengan BRE, tetapi sangat sedikit yang
sed
melakukannya dengan benar. GNUsed
melakukannya.Terakhir, spasi hanya untuk membuat pola terjadi secara teratur .
Tentu saja, ini tidak akan pernah berhasil untuk Anda. Atau, mungkin lebih tepat, itu akan selalu berhasil untuk Anda, tetapi tidak pernah memberikan hasil apa pun. Bagaimana mungkin jika polanya tidak pasti ?
sumber