Como usar a substituição dupla no awk?

4

Para imprimir os campos na 29ª coluna em dois arquivos, usei

paste <(awk -F, '{print }' PreRefFile.csv) <(awk -F, '{print }' Txlog.csv)

Isso funcionou bem. Para imprimir todos os campos começando de 29 a 189. Eu escrevi um script como segue

 y=29
 while [ $y -le 189 ]
 do
   x="$$y"
   paste <(awk -F, '{print "'"$x"'"}' PreRefFile.csv) <(awk -F, '{print "'"$x"'"}' Txlog.csv)
   y='expr $y + 1'
 done

Aqui, o valor de x é substituído por "$" seguido de número (Primeira rodada de substituição) e é impresso "$" seguido por esse número em vez de imprimir o campo naquele local. Como obter esse campo dessa maneira. Não consigo escrever a mesma linha tantas vezes. Sugira um método para prosseguir.

Sugira também outra ferramenta para fazer isso, além do awk

    
por Ramana Reddy 21.04.2015 / 13:22

3 respostas

4

Tudo o que você precisa é do poder de awk e de for Statement :

paste <(awk -F, '{ for (i=29;i<=188; i++) print $i }' PreRefFile.csv) <(awk -F, '{ for (i= 29;i<= 188;i++) print $i }' Txlog.csv)

Meu caso de teste:

paste <(awk -F, '{ for (i=2;i<=3;i++) print $i }' foo1) <(awk -F, '{ for (i=2;i<=3;i++) print $i }' foo2)

Arquivo foo1 :

1,2,3,4,5,6
7,8,9,10,11,12

Arquivo foo2 :

a,b,c,d,e,f,g
A,B,C,D,E,F,G

Resultado:

2   b
3   c
8   B
9   C
    
por A.B. 21.04.2015 / 13:57
3

A variável que você define x="$$y" não está disponível nas subshells <(...) . Esse é o problema. Use export para disponibilizá-lo em comandos executados posteriormente, mas ele será, de qualquer forma, expandido pelo shell pai. As subshells nunca vêem a variável, mas, em vez disso, vêem o valor que a shell pai a substituiu. Como @ EliahKagan notado nos comentários.

Além disso, seu awk pode ser um pouco mais simples. Veja o exemplo (usei echo para simular um arquivo com 2 campos):

x=2
paste <(echo "a1,a2" | awk -F, '{print $'$x'}' ) <(echo "b1,b2" | awk -F, '{print $'$x'}')

A saída seria então:

a2      b2
    
por chaos 21.04.2015 / 13:57
2

Usando bash :

#!/bin/bash
paste PreRefFile.csv Txlog.csv | while IFS=$'\t' read a b; do
  i=29
  while [[ $i -le 189 ]]; do
    printf "$(cut -d, -f$i<<<"$a")\t$(cut -d, -f$i<<<"$b")\n"
    i=$((i+1))
  done
done

Usando python :

#!/usr/bin/env python2
import csv, itertools
with open('PreRefFile.csv') as a, open('PreRefFile.csv') as b:
    for i, j in itertools.izip_longest(csv.reader(a), csv.reader(b)):
        check = 28
        while check <= 188:
            print i[check] + '\t' + j[check]
            check += 1
    
por heemayl 21.04.2015 / 14:20