Diberikan input dari formulir
XY981743 foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar foolkasjfdrte
bagaimana saya bisa memotong kolom kedua saja? Pembatasnya adalah TAB dan kolom kedua harus paling panjang 75 karakter.
text-processing
sed
awk
LoukiosValentine79
sumber
sumber
awk 'BEGIN{OFS=FS="\t"} {$2=substr($2,1,75)}1' file
Jawaban:
Jika Anda ingin mencetak hanya 75 karakter pertama dari kolom kedua (termasuk spasi, dan dengan asumsi hanya dua kolom dalam file), Anda dapat melakukan:
Atau, dengan GNU
sed
:Atau:
Atau, Anda bisa menggunakan
fold
, menyuruhnya memotong pada 91 karakter pertama (itu 8 untuk pengidentifikasi dan 8 lainnya untuk tab), dan mencetak hanya baris pertama:Jika file Anda dapat memiliki lebih dari 2 kolom dan Anda hanya ingin memotong kolom kedua, Anda dapat melakukannya (yang, seperti yang baru saja saya perhatikan, hanyalah penulisan ulang jawaban Stephen ):
Atau (perhatikan bahwa ini akan pecah jika 75 karakter pertama dari kolom ke-2 dapat diartikan sebagai ekspresi reguler):
sumber
sed
Perintah pertama Anda juga menggunakan GNUism (\t
).\t
itu GNUisme? Serius? Apa cara portabel untuk menggambarkan tab?\n
(dan sekali lagi tidak di dalam[...]
dengan banyak implementasi), tidak ada pada RHS.perl
tidak masuk akal. Pikirkan misalnya input sepertiaba\t.*
Menggunakan
awk
, pisahkan file menggunakan tab dan hasilkan bidang pertama secara penuh dan 75 karakter pertama (paling banyak) dari yang kedua:Seperti yang ditunjukkan oleh fedorqui , Anda dapat menangani file dengan lebih dari dua bidang dengan mengganti bidang yang harus Anda potong:
Anda bisa menerapkannya
substr
ke beberapa bidang dengan mengulanginya jika perlu.sumber
;
perlu ekstra ?/pattern/ {action} {exception-handling}
contohnya). Sekarang itu akan sangat tidak mungkin mengingat bahwa menghilangkan itu;
cukup umum.Portable / POSIXly dengan
sed
:Atau untuk memotong setiap kolom:
sumber
Jika hanya ada 2 kolom:
{0,75}
berarti memilih dari 0 hingga 75 karakter..*
adalah bagian yang dihapus di luar char 75.Jika ada 2 kolom atau lebih :
[^\t]*
adalah bagian yang dihapus di luar char 75.sumber
sed
dan yangPOSIXLY_CORRECT
tidak di lingkungan ..