如何在 awk 中使用双重替换?

如何在 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 之外,还建议使用其他工具来执行此操作

答案1

你所需要的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

答案2

您设置的变量x="\$$y"在子 shell 中不可用<(...)。这就是问题所在。使用export使其在后续执行的命令中可用,但它无论如何都会被父 shell 扩展。子 shell 永远不会看到该变量,而是看到父 shell 替换它的值。如 @伊莱亚·卡根在评论中注意到。

你也awk可以更简单一点。看这个例子(我用来echo模拟一个有 2 个字段的文件):

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

输出结果为:

a2      b2

答案3

使用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

相关内容