Eliminar los últimos n caracteres de las líneas dentro del archivo

Eliminar los últimos n caracteres de las líneas dentro del archivo

Estoy usando una terminal Mac (bash) y tengo un archivo llamado data_list.txtque contiene nlas siguientes líneas:

aaabbbccc_7777.txt 
nnhhaa_8888.txt 
ayquabay_9999.txt 
ayqynbnbn_1122.txt 
ooppaa_3454.txt

¿Cómo puedo eliminar los últimos 8 caracteres de cada línea?

Salida esperada de data_list.txt:

aaabbbccc_ 
nnhhaa_ 
ayquabay_ 
ayqynbnbn_ 
ooppaa_

Gracias por cualquier ayuda

Respuesta1

Si deseas eliminar los últimos 8 caracteres, o todos si son menos de 8, puedes hacer:

sed "s/.\{0,8\}$//; /^$/d" data_list.txt

No hay necesidad de expresiones regulares extendidas. Esto borrará tantos caracteres como sea posible, pero no más de 8. Si eso deja una línea vacía, se eliminará de la salida.

Si necesita borrar cualquier espacio en blanco final (sin incluirlo en los 8 caracteres), puede hacer:

sed "s/.\{0,8\}[[:space:]]*$//" data_list.txt

Sólo puedo adivinar cuál es la condición real para lo que se debe eliminar al final (por ejemplo, todo lo que está después del guión bajo o un número + la extensión), pero si desea eliminar la extensión del archivo y los dígitos anteriores:

sed "s/[[:digit:]]*\..*$//" data_list.txt

Otras respuestas ya han mostrado cómo eliminar todo lo que está después del guión bajo, así que no lo repetiré.

Respuesta2

Para su entrada exacta (todas las líneas en sus extremos tienen espacios en blanco, excepto la última línea) puede usar esto (supongo que quiere deshacerse de 'después de la parte':

sed 's/........ *$//' data_list.txt

Para deshacerse de cualquier cosa después del último carácter 'subrayado', utilice este:

sed 's/\(.*_\).*$/\1/' data_list.txt

También funcionará en líneas que tengan múltiples caracteres 'subrayados', porque sed es 'codicioso'. Aunque no sé si esto funcionará en MacOS, al menos será útil para los usuarios de Linux que el motor de búsqueda de Google aterrizará aquí...

Respuesta3

Aquí hay una awksolución que es tan rápida como el sedenfoque de frippe, usando un archivo de ejemplo con 100.000 líneas:

time awk '{print substr($0, 1, length($0)-8)}' 100k.txt

real    0m4.110s
user    0m0.142s
sys     0m0.422s

time sed "s/.\{0,8\}$//; /^$/d" 100k.txt

real    0m4.043s
user    0m1.558s
sys     0m0.345s

Reemplace 8con cualquier número. La principal diferencia aquí es que awkimprimirá una nueva línea si la longitud de corte excede la longitud de la línea, mientras que sedno.

Respuesta4

Usando Raku (anteriormente conocido como Perl_6)

raku -ne '.trim-trailing.chop(8).put;'

O

raku -pe '.=trim-trailing; .=chop(8);'

Entrada de muestra:

wxxyyyzzzz_1234.txt
aaabbbccc_7777.txt 
nnhhaa_8888.txt 
ayquabay_9999.txt 
ayqynbnbn_1122.txt 
ooppaa_3454.txt

Salida de muestra:

wxxyyyzzzz_
aaabbbccc_
nnhhaa_
ayquabay_
ayqynbnbn_
ooppaa_

Tenga en cuenta que ambas respuestas anteriores utilizan la trim-trailingrutina de Raku para deshacerse de los espacios en blanco finales. Siéntase libre de eliminar trim-trailingy/o ajustar el número de caracteres chop-ped desde el extremo derecho de la cadena.

https://docs.raku.org/routine/chop
https://raku.org

información relacionada