Как использовать двойное замещение в awk?

Для печати полей в 29-м столбце в двух файлах я использовал

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

Это работало нормально. Чтобы напечатать все поля, начиная с 29 до 189. Я написал скрипт следующим образом

 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

Здесь значение x заменяется на «$», за которым следует число (первый раунд замены), и оно печатает «$» следует за этим числом вместо печати поля в этом месте. Как получить это поле таким образом. Я не могу написать одну и ту же строку столько раз. Предложите метод для продолжения.

Также предложите другой инструмент для этого, кроме awk

.
4
задан 21 April 2015 в 14:22

3 ответа

Все, в чем Вы нуждаетесь, являются питанием awk и for Оператор :

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)

Мой тестовый сценарий:

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

Файл foo1:

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

Файл foo2:

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

Вывод:

2   b
3   c
8   B
9   C
4
ответ дан 22 April 2015 в 00:22

Переменная, которую Вы устанавливаете x="\$y", не доступна в подоболочках <(...). Это - проблема. Используйте export для предоставления доступа к этому доступным во впоследствии выполняемых командах, но это будет так или иначе расширено родительской оболочкой. Подоболочки никогда не видят переменную, но вместо этого видят значение родительская оболочка, которой заменяют его. Как EliahKagan замечен в комментариях.

Также Ваш awk может быть немного более простым. Посмотрите пример (я использовал echo для моделирования файла с 2 полями):

x=2
paste <(echo "a1,a2" | awk -F, '{print  

вывод затем был бы:

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

вывод затем был бы:

a2      b2
$x'}')

вывод затем был бы:

a2      b2
3
ответ дан 22 April 2015 в 00:22

Используя bash:

#!/bin/bash
paste PreRefFile.csv Txlog.csv | while IFS= 

Используя 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
\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

Используя 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
2
ответ дан 22 April 2015 в 00:22

Другие вопросы по тегам:

Похожие вопросы: