substitui a coluna de um arquivo csv pela coluna de outro arquivo

4

Eu tenho dois arquivos de exemplo como este:

$ cat file1
abc,sachin
cat,kumar 

$ cat file2
xyz
pressure

$ cat file3 
xyz,sachin
pressure, kumar 

Eu quero que a primeira coluna de file1 seja substituída por file2 .

Eu tentei fazer algo assim:

$ awk 'FNR==NR{a[NR]=$3;next}{$2=a[FNR]}1' file1 file2

Estou usando o Solaris 10 e ele não parece suportar isso. Alguma outra sugestão?

    
por praveen 23.05.2014 / 12:24

3 respostas

4

Que tal usar cut e paste ? Se o seu shell suporta substituições de processos, então

$ paste -d, file2.txt <(cut -d, -f2 file1.txt)
xyz,sachin
pressure,kumar 
    
por 23.05.2014 / 13:36
3

Você precisa especificar o separador de campo de entrada. Além disso, não tenho certeza de como você está escolhendo os campos. No awk, os campos são baseados em 1. Você não tem 3 campos em nenhum dos arquivos de entrada.

O seguinte deve funcionar para você:

awk -F, 'FNR==NR{a[NR]=$1;next}{$1=a[FNR]}1' OFS=, file2.txt file1.txt

Para sua entrada de exemplo, ela produziria:

xyz,sachin
pressure,kumar
    
por 23.05.2014 / 12:36
0

Você deve tentar a resposta do @ devnull com /usr/xpg4/bin/awk ou nawk .

Muitos dos programas em /usr/bin e /bin em Solaris não são POSIX compatíveis.

Ou você pode usar perl para portáteis:

$ perl -nle '                  
    unless (/,/) {                  
        push @a, $_;       
        next;
    }
    @l = split ",", $_;
    print "$a[$i++],$l[1]";
' file2.txt file1.txt
xyz,sachin
pressure,kumar

Ainda mais curto:

$ perl -F',' -anle '
    if (@F == 1) {push @a,$_;next}    
    print "$a[$i++],$F[1]";
' file2.txt file1.txt
    
por 23.05.2014 / 12:57