Como posso adicionar uma coluna de valores em um arquivo que possui um certo número de linhas. Eu tenho um arquivo de entrada como este:
Arquivo de entrada:
SPATA17 1 217947738
LYPLAL1 1 219383905
FAM47E 4 77192838
SHROOM3 4 77660162
SHROOM3 4 77660731
SHROOM3 4 77662248
Arquivo de saída:
SPATA17 1 217947738 file1
LYPLAL1 1 219383905 file1
FAM47E 4 77192838 file1
SHROOM3 4 77660162 file1
SHROOM3 4 77660731 file1
SHROOM3 4 77662248 file1
Nesse caso, quero adicionar uma coluna de valores, até o número de linhas no arquivo. O valor permanece consistente, como "arquivo1".
O motivo é que eu tenho 100 desses arquivos. Não quero abrir cada arquivo e colar uma coluna. Também existe alguma maneira de automatizar isso, entrando em um diretório e adicionando uma coluna de valores. O valor vem do nome do arquivo, que deve ser adicionado em cada linha do arquivo na última / primeira coluna.
fonte
sed
é mais prático para substituição de padrões e economia no local. Para sua exigência de salvar o arquivo, era uma opção relativamente conveniente. Se você não precisar gravar novamente no mesmo arquivo que está processando,awk
geralmente será muito mais fácil trabalhar com ele.awk
separadores de campo de entrada / saída com muita frequência e, portanto, tento evitar usá-lo sempre que possível, tornando-osed
mais atraente.Vamos lá, por que vocês recomendam essas ferramentas poderosas quando há
paste
comando!Com um pouco de truque, você pode usar
paste
para o objetivo do OP. No entanto, ele não substituirá os arquivos no local:Isso irá colar o nome do arquivo respectivo como a última coluna de cada arquivo no novo arquivo
filename.new
fonte
paste
é certamente uma jóia escondida.Você pode usar
awk
:fonte
FILENAME
é uma variávelawk
, ela se expande para o nome do arquivo atual queawk
está sendo processado. Você apenas faz um, alimenta todos os arquivos paraawk
.GNU awk 4.1.0
ou mais tarde, poderá usar-i
para editar no local. Caso contrário, você deve redirecionar aawk
saída para um arquivo temporário e usá-logrep
para extrair a linha de cada arquivo.for file in *; do awk 'BEGIN{OFS="\t"}{print $0, FILENAME}' $file; done