¿Cómo agregar columnas a un archivo (preferiblemente usando sed -i) cuando solo hay una columna?

¿Cómo agregar columnas a un archivo (preferiblemente usando sed -i) cuando solo hay una columna?

Digamos que tengo una columna de datos como esta:

sample123
sample456
samplexyz

Puedo agregar fácilmente dos columnas nuevas usando:

sed -i "s/$/\t1.1\tC/" <file.txt>

Ahora es:

sample123   1.1 C
sample456   1.1 C
samplexyz   1.1 C

Ahora digamos que agrego algunos datos nuevos en la parte inferior:

sample123   1.1 C
sample456   1.1 C
samplexyz   1.1 C
sampleNew1
sampleNew2
sampleNew3

Si intento agregar las nuevas columnas para estos datos, se agregan a todas las filas, así que ahora cuando ejecuto:

sed -i "s/$/\t1.2\tA/" <file.txt>

Parece que:

sample123   1.1 C   1.2 A
sample456   1.1 C   1.2 A
samplexyz   1.1 C   1.2 A
sampleNew1  1.2 A
sampleNew2  1.2 A
sampleNew3  1.2 A

¿Cómo agrego las columnas donde no hay otras columnas excepto la primera?

Respuesta1

Pruebe primero si la línea actual tiene tabulación o no, y solo realice la sustitución si no la tiene:

sed -i '/\t/!s/$/\t1.2\tA/' file

Aquí, abordamos todas las líneas que no contienen un carácter de tabulación usando /\t/!y aplicamos la sustitución a esas líneas.

Lo anterior supone que GNU sedpuede reconocerlo \tcomo un carácter de tabulación. Es posible que otras sedimplementaciones necesiten utilizar un carácter de tabulación literal en lugar de \t. Otras sedimplementaciones también pueden manejar la -iopción de manera diferente a GNU sed(consulte "¿Cómo puedo lograr portabilidad con sed -i (edición in situ)?").


Usando awk:

awk -F "\t" 'BEGIN { OFS=FS } NF == 1 { $2 = "1.2"; $3 = "A" }; 1' file

Esto probaría el número de campos delimitados por tabulaciones y, si solo hay un campo, agregaría un segundo y un tercer campo nuevos antes de imprimir la línea.

Esto no cambiaría el archivo local. Para eso, usa GNU awkasí:

awk -i inplace -F "\t" 'BEGIN { OFS=FS } NF == 1 { $2 = "1.2"; $3 = "A" }; 1' file

Para obtener más información sobre awklas ediciones in situ, consulte "¿Cómo cambiar permanentemente un archivo usando awk? (ediciones "in situ", como con "sed -i")".

información relacionada