Для печати полей в 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
. Все, в чем Вы нуждаетесь, являются питанием 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
Переменная, которую Вы устанавливаете 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
Используя 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