csv 文件在行中添加和删除字符

csv 文件在行中添加和删除字符

我有一个很大的 csv 文件,看起来像这样

else if(a,b,c,d,e)
else if(a,b,c,d,f)

我想让它看起来像这样

else if(a+x==b and b+x==c and c+x==d and d+x==e)
else if(a+x==b and b+x==c and c+x==d and d+x==f)

我并不总是有 5 个变量,有些行少于这个数字,5 是最大值,2 是最小值。

基本上删除逗号并在每个变量后添加var+x==var2 and var2+x==var3;使其看起来像 C++ if 语句。这在 sed、awk 或 perl 中可行吗?出于学习目的,我对 awk 最感兴趣,但如果可行,任何解决方案都是好的。

答案1

单程:

echo "else if(a,b,c,d,e)" | perl -pe 's/,([a-z])(?=[^)])/+x==$1 and $1/g; s/,([a-z])/+x==$1/'

答案2

跳过该perl部分并尝试这个:

awk -F',' '{x = $1"+x=="$2; \
    for (i=2; i< NF; i++) { \
         x = x " and " $i "+x=="$(i+1) \
    }; \
    print "else if" x \
}'

影响:

$ echo '(a,b,c,d,e)' | awk -F',' '{x = $1"+x=="$2; \
quote>     for (i=2; i< NF; i++) { \
quote>          x = x " and " $i "+x=="$(i+1) \
quote>     }; \
quote>     print "else if" x \
quote> }'
else if(a+x==b and b+x==c and c+x==d and d+x==e)

perl使其与(已经存在的)输出一起工作并不太困难else if,但如果它不会使事情复杂化(如在这种情况下),使用一个工具完成这项工作会更好。

答案3

纯文本 Python 解决方案。它至少需要 2 个变量,没有最大值。

#!/usr/bin/env python3

sourcefile = "/path/to/sourcefile"

def newline(oldline):
    subject = oldline.replace(" ", "").split("(")[-1].replace(")", "").split(",")
    out = [subject[i]+"+x=="+subject[i+1] for i in range(len(subject)-1)]
    print("else if("+" and ".join(out)+")")

with open(sourcefile) as sc:
    for line in [line.strip() for line in sc.readlines()]:
        newline(line)

将其复制到一个空文件中,另存为edit.py,设置源文件的路径,然后运行:

python3 /path/to/edit.py

它转换:

else if(a,b)
else if(a,b,c,d,f)
else if(a,b,c,d,f,q,t)

进入:

else if(a+x==b)
else if(a+x==b and b+x==c and c+x==d and d+x==f)
else if(a+x==b and b+x==c and c+x==d and d+x==f and f+x==q and q+x==t)

相关内容