¿Cómo puedo agregar una columna de valores en un archivo que tiene un cierto número de filas? Tengo un archivo de entrada como este:
Fichero de entrada:
SPATA17 1 217947738
LYPLAL1 1 219383905
FAM47E 4 77192838
SHROOM3 4 77660162
SHROOM3 4 77660731
SHROOM3 4 77662248
Archivo de salida:
SPATA17 1 217947738 file1
LYPLAL1 1 219383905 file1
FAM47E 4 77192838 file1
SHROOM3 4 77660162 file1
SHROOM3 4 77660731 file1
SHROOM3 4 77662248 file1
En este caso, quiero agregar una columna de valores, hasta el número de filas en el archivo. El valor permanece constante, como "archivo1".
La razón es que tengo 100 de esos archivos. No quiero abrir cada archivo y pegar una columna. También hay alguna forma de automatizar esto, yendo a un directorio y agregando una columna de valores. El valor proviene del nombre del archivo, que debe agregarse en cada fila del archivo en la última / primera columna.
fuente
sed
es más práctico para la sustitución de patrones y para guardar en el lugar. Para su requisito de guardar el archivo, era una opción relativamente conveniente. Si no necesita volver a escribir en el mismo archivo que está procesando,awk
generalmente es mucho más fácil trabajar con él.awk
separadores de campo de entrada / salida me hacen tropezar con demasiada frecuencia, por lo que trato de evitar usarlo siempre que sea posible, lo que lo hacesed
más atractivo.¡Vamos, por qué ustedes recomiendan esas poderosas herramientas cuando hay un
paste
comando!Con un pequeño truco, puedes usarlo
paste
para el propósito del OP. Sin embargo, no reemplazará los archivos en el lugar:Esto pegará el nombre de archivo respectivo como la última columna de cada archivo en un archivo nuevo
filename.new
fuente
paste
Es sin duda una joya escondida.Puedes usar
awk
:fuente
FILENAME
es una variableawk
, se expande al nombre de archivo actual que seawk
está procesando. Simplemente hazlo uno, alimenta todos los archivosawk
.GNU awk 4.1.0
o posterior, puede usar-i
para editar in situ. De lo contrario, debe redirigir laawk
salida a un archivo temporal, luego usargrep
para extraer la línea de cada archivo.for file in *; do awk 'BEGIN{OFS="\t"}{print $0, FILENAME}' $file; done