4 votos

¿Cómo reemplazar el contenido a múltiples archivos?

Tengo varios archivos que contienen contenido como el siguiente:

 File 1

NC_12548  og789 |nd784  -2 -54 -6

NC_12548  og789 |nd784  -2 -54 -6

NC_12548  og789 |nd784  -2 -54 -6

File2

NC_54456  og789 |nd784  -5 -56 -6

NC_98123  og859 |nd784  -5 -84 -5

NC_689.1  og456 |nd784  -5 -54 +8

File3

NC_54456  og789 |nd784  -5 -56 -6

NC_98123  og859 |nd784  -5 -84 -5

NC_689.1  og456 |nd784  -5 -54 +8
 

Quiero mantener las únicas dos primeras columnas (NC_12345 og855) y descartar el resto. ¿Cómo puedo hacer esto?

7voto

Serg Puntos 17677

Con awk puedes usar | como separador de columna y de impresión de la primera columna:

awk -F '|' '{print $1}' file1.txt file2.txt file3.txt

la salida será concatenaded. Si es necesario mantener la salida en archivos separados, considere el uso de un bucle for en el shell de alrededor de awk

# assuming they're all in the same directory,  hence `*`
for fname in ./file*.txt ; do
    # add extension to current file in "$fname" variable indicate new file
    # > does the actual redirection
    awk -F '|' '{print $1}'  "$fname" > "$fname".new
done

Tener nueva salida en .new podría ser deseable para la copia de seguridad. De lo contrario, podemos utilizar sed -i a realizar en el archivo de sustitución. Ejecutar sin -i primera para el ensayo de

# use file*.txt if they're all in the current directory
sed -i 's/|.*$//' file1.txt file2.txt file3.txt
sed -i 's/\(^.*\)|.*/\1/g' file1.txt file2.txt file3.txt

Otra opción es a través de Python:

#!/usr/bin/env python3
import sys

for fname in sys.argv:
    with open(fname) as fd_read, open(fname+'.new','w') as fd_write:
        for line in fd_read:
            fd_write.write(line.split('|')[0] + '\n')

Este script está diseñado para ser utilizado como ./script.py file1.txt file2.txt file3.txt y se escribe la salida a los nuevos archivos con .new de extensión

3voto

Xen2050 Puntos 3234

Para cortar texto, siempre pienso en cut en primer lugar, la separación por | como en jno comentario:

cut -d\| -f1 file

O es que parece que el formato es siempre de 8 caracteres, a continuación, 2 espacios, luego de más de 5 caracteres, por lo que sólo podría cortar los primeros 15 caracteres con

cut -c 1-15 file

O usted podría campos separados por espacios, pero puesto que hay dos espacios entre la primera y la segunda campos que significa que debería cortar los campos 1, 2, y 3:

cut -d" " -f 1-3 file

Corte no tenemos en lugar de la de edición de archivos como sed, pero usted puede dar salida a un nuevo archivo, a continuación, mueva sobre el archivo original, por ejemplo

for file in {file1,file2,file3}
do
  cut -d" " -f 1-3 "$file" > "$file.2"
  mv "$file.2" "$file"
done

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: