Escolha colunas de um arquivo csv de comprimento variável

1

Eu tenho dois arquivos CSV, que compartilham uma coluna única para cada linha de cada arquivo, como um ID. Os arquivos não têm cabeçalho. O arquivo_2 tem colunas de tamanho variável, por exemplo,

1,2,3
4,5,6,7,8

Eu me juntei a dois campos baseados na coluna comum primeiro classificando com o comando sort e usando join nessa coluna. Agora eu tenho um único arquivo csv com colunas de tamanho variável.

Eu quero escolher as colunas na seguinte ordem:

second column, first column, third column, {from 4th column onwards every 3rd column till end of row. e.g., 4,7,10...}

Eu tentei awk -F "\"*,\"*",\"*" '{print $2 $1 $3}' joinedfile.csv

e conseguiu obter essas três colunas. No entanto, nenhuma ideia para lidar com o resto. Eu sei como fazer isso em python. Eu gostaria de saber como fazer isso no comando shell como cut ou awk. Eu estou supondo que um loop while no awk pode ajudar, mas não tenho certeza de como construir.

    
por seek 06.07.2015 / 04:01

2 respostas

1

Algo como:

awk -F, '{
    # print first three columns
    printf("%s,%s,%s", $2,$1,$3);

    #for all other columns
    for ( i = 4; i < NF; i++ )
    {
        # if column number every third
        if ( ( i - 4 ) % 3 == 0) {
            printf(",%s", $i);
        }
    }
    #print newline
    print "";
}' your_file.csv
    
por 06.07.2015 / 04:45
0

Pure shell, deve funcionar desde que haja menos de 26 colunas:

while IFS=, read a b c d e f g h i j k l m n o p q r s t u v w x y z
do 
    printf '%s,' $b $a $c $d $g $j $m $p $s $v $y
    printf '\b \b\n' 
done < joinedfile.csv

Se houver mais que 26 colunas, tente o seguinte:

tr , ' ' < joinedfile.csv | 
while read a; do 
    set -- $a
    printf '%s,' $2 $1 $3
    while [ "$4" ] ; do 
        shift 3
        printf '%s,' "$1"
    done
    printf '\b \b\n'
done
    
por 02.04.2018 / 05:26