Adicionando uma coluna de valores em um arquivo delimitado por tabulação

15

Como posso adicionar uma coluna de valores em um arquivo que tenha um determinado 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

Neste caso, quero adicionar uma coluna de valores, até o número de linhas no arquivo. O valor permanece consistente, como "arquivo1".

O motivo é que tenho 100 desses arquivos. Não quero abrir cada arquivo e colar uma coluna. Também existe alguma maneira de automatizar isso, indo 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.

    
por Ron 28.02.2014 / 22:56

3 respostas

20

Você pode usar um loop de uma linha como este:

for f in file1 file2 file3; do sed -i "s/$/\t$f/" $f; done

Para cada arquivo na lista, isso usará sed para anexar ao final de cada linha uma guia e o nome do arquivo.

Explicação:

  • Usando o sinal -i com sed para realizar uma substituição no local, sobrescrevendo o arquivo
  • Execute uma substituição com s/PATTERN/REPLACEMENT/ . Neste exemplo, PATTERN é $ , o fim da linha, e REPLACEMENT é \t (= a TAB), e $f é o nome do arquivo, da variável de loop. O comando s/// está entre aspas duplas para que o shell possa expandir as variáveis.
por 28.02.2014 / 23:24
9

Por que vocês recomendam essas poderosas ferramentas quando há o comando paste !

$ cat a
A
B
C
D
$ cat b
1
2
3
4
$ paste a b
A   1
B   2
C   3
D   4

Com um pequeno truque, você pode usar paste para o propósito do OP. No entanto, ele não substituirá os arquivos no local:

for f in file1 file2 file3; do 
    paste $f <(yes $f | head -n $(cat $f | wc -l)) > $f.new
done

Isto irá colar o respectivo nome do arquivo como a última coluna de cada arquivo no novo arquivo filename.new

    
por 01.03.2014 / 01:42
8

Você pode usar awk :

awk '{print $0, FILENAME}' file1 file2 file3 ...
    
por 28.02.2014 / 23:00