У меня есть большой 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 и var2+x==var3
; чтобы это выглядело как C++ if statement. Можно ли это сделать в sed, awk или perl? Меня в основном интересует awk, в целях обучения, но любое решение будет хорошим, если оно работает.
Пропустите 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
в), но использование одного инструмента для задания лучше, если это не усложняет вещи (как в этом случае).
Один путь:
echo "else if(a,b,c,d,e)" | perl -pe 's/,([a-z])(?=[^)])/+x==$1 and $1/g; s/,([a-z])/+x==$1/'
Чистое текстовое решение для 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)