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 sed
puede reconocerlo \t
como un carácter de tabulación. Es posible que otras sed
implementaciones necesiten utilizar un carácter de tabulación literal en lugar de \t
. Otras sed
implementaciones también pueden manejar la -i
opció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 awk
así:
awk -i inplace -F "\t" 'BEGIN { OFS=FS } NF == 1 { $2 = "1.2"; $3 = "A" }; 1' file
Para obtener más información sobre awk
las ediciones in situ, consulte "¿Cómo cambiar permanentemente un archivo usando awk? (ediciones "in situ", como con "sed -i")".