Tampilkan karakter pada posisi dalam file


11

Saya ingin mencetak karakter pada posisi tertentu hanya dengan menggunakan baris perintah. Misalnya:

<command> 5

Akan ditampilkan ajika karakter ke-5 dari file itu adalah a.

Karena saya berurusan dengan file besar, idealnya ini bisa menangani file besar.

Jawaban:


4

Dengan sed:

$ echo 12345 | sed 's/.\{4\}\(.\).*/\1/;q'
5
$ echo 1234ắ | sed 's/.\{4\}\(.\).*/\1/;q'
ắ

Perhatikan bahwa sedakan gagal menghasilkan output jika Anda memasukkan karakter multi-byte yang tidak valid di lokal saat ini. Anda dapat menggunakan LC_ALL=Cjika Anda hanya bekerja dengan karakter byte tunggal.

Dengan file ASCII, Anda juga dapat menggunakan dd:

$ echo 12345 | dd bs=1 skip=4 count=1 2>/dev/null
5

1
Apakah ada solusi yang tidak melibatkan harus menyalurkan input? Jika tidak, file bit akan lambat, bukan?
testTester

1
@ testTester: Cukup gunakan file Anda sebagai operan ke perintahsed 's/.\{4\}\(.\).*/\1/;q' file
cuonglm

9

Jika Anda menginginkan byte ke-5, hitung dari 1:

dd ibs=1 skip=4 count=1

atau

tail -c +5 | head -c 1

Perhatikan bahwa taildihitung dari 1, jadi diberi file yang berisi abcdefg, ini dicetak e.

dddan tail -cdalam POSIX. head -citu umum, tetapi tidak dalam POSIX; itu ada di GNU coreutils, BusyBox, FreeBSD dan NetBSd dan tetapi tidak di OpenBSD atau Solaris.


Mungkin perlu disebutkan bahwa dalam bentuk mereka saat ini, perintah ini tidak akan melakukan apa pun. Anda harus menambahkan parameter nama file ke perintah atau memasukkan pipa ke dalamnya. mis:cat file | tail -c +5 | head -c 1
rinogo

1
@rinogo Kedua perintah membaca dari input standar dan menulis ke output standar.
Gilles 'SO- berhenti bersikap jahat'

1
Memang! Tujuan saya adalah membantu mereka yang baru di Unix memahami cara memasukkan data ke dalam perintah.
rinogo

2

Atau menggunakan (gnu) grep:

grep -zoP '.{4}\K.'   file

( -zDigunakan untuk menangani \nsebelum char ke-5)

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.