我有一个很大的 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)