重新定位CSV文件中的数字列

时间:2017-04-06 14:04:15

标签: python perl awk

我有一个数据文件如下:

G70,ge,33,61,ge,CD,33,40,CD,in,40,50,INt,CD,50,61,CD
G83,ge,53,98,ge,CD,53,60,CD,in,60,68,INt,CD,68,75,CD,75,98,hg

在每一行中,我需要相对于小于第三列中的值的所有数字列进行重新定义。

最终结果如下。实际上我有一个更大的文件,列数不同

G70,ge,1,29,ge,CD,1,8,CD,in,8,18,INt,CD,18,29,CD
G83,ge,1,46,ge,CD,1,8,CD,in,8,15,INt,CD,15,23,CD,23,46,hg

我试过这个awk代码,但它对我不起作用

awk -F, 'BEGIN{for(i=3;i<=NF;i+=4){array[i] = i+1;} {for(i in array) printf $i-$3+1""$array[i]-$3+1""FS;print ""}' 

请帮助我让这个工作。或者可以选择Perl或Python解决方案。

2 个答案:

答案 0 :(得分:0)

这是使用Python的解决方案。

import csv

lists = list()
with open('test.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        v = int(row[2]) - 1
        lists.append([int(item) - v if item.isdigit() else item for item in row])


print(lists)
"""
[['G70', 'ge', 1, 29, 'ge', 'CD', 1, 8, 'CD', 'in', 8, 18, 'INt', 'CD', 18, 29, 'CD'], 
['G83', 'ge', 1, 46, 'ge', 'CD', 1, 8, 'CD', 'in', 8, 16, 'INt', 'CD', 16, 23, 'CD', 23, 46, 'hg']]
"""

答案 1 :(得分:0)

在这个问题上曾经有一个Perl标签和一个特定的句子说Perl或Python解决方案也是可以接受的。我不知道为什么会被删除

您可以使用Perl执行此操作,如下所示

perl -pe '$b = (split /,/, $_, 4)[2]-1; s/\b(\d+)\b/$1-$b/eg;' myfile

请注意,这假设不需要保持不变的字段包含小数位数

输出

G70,ge,1,29,ge,CD,1,8,CD,in,8,18,INt,CD,18,29,CD
G83,ge,1,46,ge,CD,1,8,CD,in,8,16,INt,CD,16,23,CD,23,46,hg