为了打印两个文件中第 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