4 votos

Cómo utilizar doble sustitución en awk?

Imprimir los campos de 29 de columna en dos archivos que he utilizado

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

Esto funcionó bien. Para imprimir todos los campos a partir del 29 de 189. Escribí un guión de la siguiente manera

 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

Aquí el valor de x se sustituye por "$" seguido por un número (Primera ronda de sustitución) y es la impresión de "$" follwed por ese número en lugar de imprimir el campo en ese lugar. Cómo conseguir que el campo de esta manera. No puedo escribir en la misma línea para así muchas veces. Sugerimos un método para proceder.

También sugieren otra herramienta para hacer esto, aparte de awk

4voto

A.B. Puntos 44943

Todo lo que usted necesita es el poder de la awk y for Declaración:

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)

Mi caso de prueba:

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

Archivo foo1:

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

Archivo foo2:

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

Salida:

2   b
3   c
8   B
9   C

3voto

chaos Puntos 11188

La variable que establezca x="\$$y" no está disponible en el subshells <(...). Ese es el problema. Uso export para que esté disponible en posteriormente comandos ejecutados, pero que de todos modos se expandió por el padre de la shell. El subshells nunca vea la variable, pero en lugar de ver el valor de la shell principal sustituido por ello. Como @EliahKagan notado en los comentarios.

También su awk puede ser un poco más simple. Véase el ejemplo (yo usé echo para simular un archivo con 2 campos):

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

La salida sería:

a2      b2

2voto

heemayl Puntos 21116

El uso de 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

El uso de 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

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: