Adicionando novas colunas em um arquivo csv

2

Eu quero acrescentar duas novas colunas no início de um arquivo csv usando bash scripting de forma que as primeiras quatro letras do nome do arquivo sejam os valores da primeira coluna e as próximas duas letras sejam os valores da segunda. coluna. Por exemplo, se meu nome de arquivo .csv for "exam_20", quero ter uma nova primeira coluna com todas as entradas como "exam" e uma nova segunda coluna com todas as entradas como "20". Alguém sabe como conseguir isso em bash? Agradecemos antecipadamente.

    
por zsha 04.07.2016 / 18:02

2 respostas

3

Este código deve fazê-lo, usando sed, salve-o como um arquivo executável e execute com o caminho completo para o arquivo de origem como o primeiro (e único) parâmetro. Você pode salvar a saída para um novo arquivo, se quiser.

#!/bin/bash
FILE=$1
# check the file exists
[[ -s $FILE ]] || { echo "Can't locate file '$FILE', aborting" >&2; exit 1; }
# get the filename without directory
NAME=$(basename "$1")
# get the first 4 characters as FIRST
FIRST=${NAME:0:4}
# get the 6th & 7th characters as SECOND
SECOND=${NAME:5:2}
# are we good to go?
read -t30 -p "About to prefix '$FIRST,$SECOND,' to all lines in $FILE - ok (y/-): "
[[ $REPLY == "y" ]] || { echo "No changes made"; exit 0; }
# do it
sed "s/^/$FIRST,$SECOND,/" "$FILE"
exit 0

arquivo exam_02:

line1,some,stuff
line2,some,more,stuff

saída:

exam,02,line1,some,stuff
exam,02,line2,some,more,stuff
    
por 04.07.2016 / 18:20
3

com awk :

#!/usr/bin/awk -f

BEGIN { OFS="," };

FNR==1 {
  split(FILENAME,c,/[_.]/);
};

{ print c[1], c[2], $0 }

Ou como um verso para executar na linha de comando ou incorporar em um script de shell:

awk -v OFS=',' 'FNR==1 {split(FILENAME,c,/[_.]/)}; {print c[1],c[2],$0}' *.csv

Para cada arquivo de entrada, isso divide cada FILENAME em uma matriz c , usando a classe de caractere [_.] como separadores de campo. Campos 1 e amp; 2 da matriz c são pré-pagas para cada linha do arquivo.

Exemplo de saída:

$ ./zsha.awk exam_20.csv 
exam,20,1,2,3,4
exam,20,5,6,7,8
exam,20,9,10,11,12

Os dados de entrada usados no exemplo foram:

$ cat exam_20.csv 
1,2,3,4
5,6,7,8
9,10,11,12
    
por 04.07.2016 / 18:40