adiciona uma coluna de identidade incremental a um arquivo

2

Duas perguntas:

1) Existe uma maneira de criar uma nova coluna (ou seja, ID) para um arquivo existente contendo dados e o novo ID de coluna preenchido como um número de incremento automático?

por exemplo:
(O arquivo atual tem cabeçalhos e é delimitado por PIPE.)

os dados são assim

"COL1"|"COL2"|"COL3"|"COL4"|"COL5"
"A1"|"B1"|"C1"|"D1"|"E1"
"A2"|"B2"|"C2"|"D2"|"E2"
"A3"|"B3"|"C3"|"D3"|"E3"

gostaria que fosse

"ID"|"COL1"|"COL2"|"COL3"|"COL4"|"COL5"
"1"|"A1"|"B1"|"C1"|"D1"|"E1"
"2"|"A2"|"B2"|"C2"|"D2"|"E2"
"3"|"A3"|"B3"|"C3"|"D3"|"E3"

2) Existe uma maneira de substituir uma coluna existente por uma nova coluna para um arquivo existente que contém dados. A nova coluna seria "ID" e preenchida como um número de incremento automático?

por exemplo:
(O arquivo atual tem cabeçalhos e é delimitado por PIPE.)

os dados são assim

"COL1"|"COL2"|"COL3"|"COL4"|"COL5"
"A1"|"B1"|"C1"|"D1"|"E1"
"A2"|"B2"|"C2"|"D2"|"E2"
"A3"|"B3"|"C3"|"D3"|"E3"

gostaria que fosse

"COL1"|"COL2"|"ID"|"COL4"|"COL5"
"A1"|"B1"|"1"|"D1"|"E1"
"A2"|"B2"|"2"|"D2"|"E2"
"A3"|"B3"|"3"|"D3"|"E3"
    
por Tim R 13.10.2016 / 00:31

2 respostas

2

$ cat file
"COL1"|"COL2"|"COL3"|"COL4"|"COL5"
"A1"|"B1"|"C1"|"D1"|"E1"
"A2"|"B2"|"C2"|"D2"|"E2"
"A3"|"B3"|"C3"|"D3"|"E3"

1)

$ awk '{printf "\"%s\"|%s\n", NR==1 ? "ID" : NR-1, $0}' file
"ID"|"COL1"|"COL2"|"COL3"|"COL4"|"COL5"
"1"|"A1"|"B1"|"C1"|"D1"|"E1"
"2"|"A2"|"B2"|"C2"|"D2"|"E2"
"3"|"A3"|"B3"|"C3"|"D3"|"E3"

2) reorganize a saída de 1)

$ awk '{printf "\"%s\"|%s\n", NR==1 ? "ID" : NR-1, $0}' file |\
    awk 'BEGIN{FS=OFS="|"} {print $2,$3,$1,$4,$5,$6}'
"COL1"|"COL2"|ID|"COL3"|"COL4"|"COL5"
"A1"|"B1"|"1"|"C1"|"D1"|"E1"
"A2"|"B2"|"2"|"C2"|"D2"|"E2"
"A3"|"B3"|"3"|"C3"|"D3"|"E3"

2) ou diretamente do awk

$ awk 'BEGIN{FS=OFS="|"} {print $1,$2,NR==1 ? "ID" : "\""NR-1"\"",$3,$4,$5}' file
"COL1"|"COL2"|ID|"COL3"|"COL4"|"COL5"
"A1"|"B1"|"1"|"C1"|"D1"|"E1"
"A2"|"B2"|"2"|"C2"|"D2"|"E2"
"A3"|"B3"|"3"|"C3"|"D3"|"E3"
    
por 13.10.2016 / 00:56
0

Embora você tenha marcado essa questão com awk e sed, o Python pode fazer o mesmo trabalho tão bem quanto. O script abaixo tem duas funções para resolver cada uma das suas perguntas. Comente / descomente-os conforme necessário. Observe que o script usa o arquivo de entrada como primeiro argumento posicional na linha de comandos e grava em um arquivo temporário. Descomente a última linha na função main para realmente editar o arquivo original.

Origem do script

#!/usr/bin/env python
import sys
import os

def prepend_column(input,output):
    for index,line in enumerate(input):
        if index == 0:
            output.write(line)
            continue
        output.write('"' + str(index) +'"|' + line)

def alter_column(input,output):
    for index,line in enumerate(input):
        if index == 0: 
            output.write(line)
            continue
        vals = line.split('|')
        vals[2] = '"' + str(index) + '"'
        output.write('|'.join(vals))

def main():
    temp = '/tmp/temp_text'
    with open(sys.argv[1]) as f:
         with open(temp,'w') as t:
            # alter_column(f,t)
            prepend_column(f,t)
    # uncomment line below to actually replace original file
    # os.rename(temp,sys.argv)

if __name__ == '__main__': main()

Demo.

Anexando coluna:

bash-4.3$ python process_columns.py data.txt 
bash-4.3$ cat /tmp/temp_text
"COL1"|"COL2"|"COL3"|"COL4"|"COL5"
"1"|"A1"|"B1"|"C1"|"D1"|"E1"
"2"|"A2"|"B2"|"C2"|"D2"|"E2"
"3"|"A3"|"B3"|"C3"|"D3"|"E3"

Alterando uma coluna:

bash-4.3$ python process_columns.py data.txt 
bash-4.3$ cat /tmp/temp_text
"COL1"|"COL2"|"COL3"|"COL4"|"COL5"
"A1"|"B1"|"1"|"D1"|"E1"
"A2"|"B2"|"2"|"D2"|"E2"
"A3"|"B3"|"3"|"D3"|"E3"
    
por 13.10.2016 / 01:52

Tags