Mostrar carácter en la posición en un archivo

11

Me gustaría imprimir el personaje en una posición dada usando solo la línea de comando. P.ej:

<command> 5

Saldría asi el quinto carácter de ese archivo fuera a.

Como estoy tratando con archivos grandes, idealmente esto sería capaz de manejar archivos grandes.

testTester
fuente

Respuestas:

4

Con sed:

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

Tenga en cuenta que sedno producirá salida si la entrada contiene caracteres de varios bytes no válidos en la configuración regional actual. Puede usarlo LC_ALL=Csi trabaja solo con caracteres de un solo byte.

Con el archivo ASCII, también puede usar dd:

$ echo 12345 | dd bs=1 skip=4 count=1 2>/dev/null
5
Cuonglm
fuente
1
¿Hay alguna solución que no implique tener que canalizar la entrada? De lo contrario, será lento en archivos de bits, ¿no?
testTester
1
@testTester: solo use su archivo como operando para el comandosed 's/.\{4\}\(.\).*/\1/;q' file
cuonglm
9

Si desea el quinto byte, contando desde 1:

dd ibs=1 skip=4 count=1

o

tail -c +5 | head -c 1

Tenga en tailcuenta que cuenta desde 1, por lo que dado un archivo que contiene abcdefg, esto se imprime e.

ddy tail -cestán en POSIX. head -ces común, pero no está en POSIX; está en GNU coreutils, BusyBox, FreeBSD y NetBSd y no en OpenBSD o Solaris.

Gilles 'SO- deja de ser malvado'
fuente
Probablemente vale la pena mencionar que en su forma actual, estos comandos no harán nada. Necesitará agregar un parámetro de nombre de archivo a los comandos o la entrada de tubería en ellos. por ejemplo:cat file | tail -c +5 | head -c 1
rinogo
1
@rinogo Ambos comandos leen desde la entrada estándar y escriben en la salida estándar.
Gilles 'SO- deja de ser malvado'
1
¡En efecto! Mi objetivo era ayudar a los nuevos en Unix a entender cómo ingresar datos en los comandos.
rinogo
2

O usando (gnu) grep:

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

( -zse usaba para tratar \nantes del quinto char)

JJoao
fuente