使用した2つのファイルの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
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)
私のテストケース:
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
を少しシンプルにすることもできます。例を参照してください(2つのフィールドを持つファイルをシミュレートするためにecho
を使用しました):
_x=2
paste <(echo "a1,a2" | awk -F, '{print $'$x'}' ) <(echo "b1,b2" | awk -F, '{print $'$x'}')
_
出力は次のようになります。
_a2 b2
_
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
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