web-dev-qa-db-ja.com

awkで二重置換を使用するには?

使用した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以外の、これを行う別のツールを提案する

4
Ramana Reddy

必要なのは、awkfor St​​atementの力です:

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
A.B.

設定した変数_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
_
3
chaos

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
2
heemayl