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.
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.
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:
$ perl -pe 's/(\t.{75}).*/$1/' file
XY981743 foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
Atau, dengan GNU sed:
$ sed 's/\(.*\t.\{75\}\).*/\1/' file
XY981743 foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
Atau:
$ sed -r 's/(.*\t.{75}).*/\1/' file
XY981743 foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
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:
$ fold -w 91 file | head -n1
XY981743 foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
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 ):
$ awk -F"\t" -vOFS="\t" '{$2=substr($2,1,75)}1;' file
XY981743 foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
Atau (perhatikan bahwa ini akan pecah jika 75 karakter pertama dari kolom ke-2 dapat diartikan sebagai ekspresi reguler):
$ perl -F"\t" -pale 's/$F[1]/substr($F[1],0,75)/e' file
XY981743 foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
sedPerintah pertama Anda juga menggunakan GNUism ( \t).
\titu GNUisme? Serius? Apa cara portabel untuk menggambarkan tab?
\n(dan sekali lagi tidak di dalam [...]dengan banyak implementasi), tidak ada pada RHS.
perltidak 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:
awk -F "\t" 'BEGIN { OFS=FS }; { print $1, substr($2, 1, 75); }'
Seperti yang ditunjukkan oleh fedorqui , Anda dapat menangani file dengan lebih dari dua bidang dengan mengganti bidang yang harus Anda potong:
awk -F "\t" 'BEGIN { OFS=FS }; { $2=substr($2, 1, 75); print }'
Anda bisa menerapkannya substrke beberapa bidang dengan mengulanginya jika perlu.
;perlu ekstra ?
/pattern/ {action} {exception-handling}contohnya). Sekarang itu akan sangat tidak mungkin mengingat bahwa menghilangkan itu ;cukup umum.
Portable / POSIXly dengan sed:
tab=$(printf '\t')
sed "s/\($tab[^$tab]\{0,75\}\)[^$tab]*/\1/"
Atau untuk memotong setiap kolom:
sed "s/\([^$tab]\{75\}\)[^$tab]*/\1/g"
Jika hanya ada 2 kolom:
sed -r 's/^([^\t]*\t)(.{0,75}).*/\1\2/'
{0,75}berarti memilih dari 0 hingga 75 karakter.
.* adalah bagian yang dihapus di luar char 75.
Jika ada 2 kolom atau lebih :
sed -r 's/^([^\t]*\t)([^\t]{0,75})[^\t]*(.*)/\1\2\3/' file
[^\t]* adalah bagian yang dihapus di luar char 75.
seddan yang POSIXLY_CORRECTtidak di lingkungan ..
awk 'BEGIN{OFS=FS="\t"} {$2=substr($2,1,75)}1' file