LINUX.ORG.RU

За^W Оцените awk скрипт


0

1
awk -F "[F][0-9]" ' {ORS=""} { print "mv " $0 " " "\""tolower($1) "f0"} {if (2>length($2)) print "0"} {ORS="\n"} {print $2 "\""}'

input:

REF01
REF010
REF02
REF03
REF04
REF05
REF06
REF07
REF08
REF09

output

mv REF01 "ref001"
mv REF010 "ref010"
mv REF02 "ref002"
mv REF03 "ref003"
mv REF04 "ref004"
mv REF05 "ref005"
mv REF06 "ref006"
mv REF07 "ref007"
mv REF08 "ref008"
mv REF09 "ref009"

Жду конструктивной критики.


Ответ на: комментарий от YAR

Велосипед же. Уже есть старые добрые проверенные решения, покрывающие весь необходимый функционал.

#! /usr/bin/awk -f
# $Id: awktris.awk,v 1.4 2006/01/31 23:14:42 tnn Exp $

# awktris - tetris in 19 lines of code, or 1516 bytes.
# hand-crafted self-extracting AWK.

# (c) 2004 Tobias Nygren <tnn+awktris-awk@nygren.pp.se>
# Do whatever you like as long as I'm credited properly.

# Compatibility
# -------------
# mawk, popular on Linux systems, doesn't work because of aggressive input
# buffering. AWK was never intended for interactive use and awktris relies
# on a hack assuming the AWK implementation leaves terminal buffering alone.
# Use GNU awk instead.

# /usr/bin/awk on Solaris is horribly broken for other reasons. They however
# ship an /usr/bin/nawk which works fine. BSD awks and Tru64 work fine.


BEGIN{p="GgM{uWstty -g_;uKl=$0;close(u)}Gt(m~systemZstty _ m)}GqM{t(l);close("\
"e);exit(0)}Gp(s~printf(s)}GhM{pZ+';Ew=0;w<12;wO)pZ-';pZ+Tn'}GrM{t(l);pZT033["\
"H';hM;Ez=0;z<20;zO) {pZ|';Ew=0;w<12;wO~i=f[w+z*12];F(w-c)>=0&&(w-c)<4&&(z-d)"\
">=0&&(z-d)<4&&b[(w-c)+(z-d)*4]) iWX_;p(i)}pZ|Tn'}hM;printfZscore: %iQrows: %"\
"iQ%sQkeys: jklmqQtnn@netilium.org _,s,o,B);tZraw'}GnM{c=4;d=0;j=16*int(randM"\
"*6);Ei=0;i<16;iO)b[i]=substr(a,i+1+j,1)I_X_}GvM{N4;yO)L4;xO)FbY4]&&((V<0||V>"\
"=12||U<0||U>=20)||(f[V+(U)*12]!W '))R0;R1}A{pZT033[HT033[2J';gM;tZraw';aWaDD"\
"DDDDXDCaDXaaXDCCaXaaXXDCCaXXaaXDCDXDDCaXaaXXaaDC_;Ei=0;i<240;iO)f[i]W _;nM;e"\
"W((S :;do echo __;sleep 1;done)&(S :;do echo `dd bs=1 count=1`;done))2>/dev/"\
"null_;E;;~eKF$1I_q'qM;F$1I_j'{cP;F!vM)cO}F$1I_k'{N4;yO)L4;xO)mY4]=b[y+(3-x)*"\
"4];Ei=0;i<16;iO)b[i]=m[i];F!vM~N4;yO)L4;xO)mY4]=b[3-y+x*4];Ei=0;i<16;iO)b[i]"\
"=m[i]}}F$1I_l'{cO;F!vM)cP}F$1I_m'{S(vM~rM;dO}dP}F$1I_'{sP;dO;F!vM~dP;N4;yO)L"\
"4;xO)FbY4]&&V>=0&&V<12&&U>=0&&U<20)f[V+(U)*12]W#_;nM;j=0;N20;yO~k=1;L12;xO~F"\
"fY12]!W#'k=0}Fk~jO;oO;L12;xO~fY12]W+_;rM}Ei=y*12+11;i>11;iP)f[i]=f[i-12];Ei="\
"0;i<12;iO)f[i]W _}}FjI1~BWsingle!_;s+=50}FjI2~BWdouble!_;s+=200}FjI3~BWtripl"\
"e!_;s+=400}FjI4~BW*tetris*_;s+=800}}F!vM~BWend :Z;rM;qM}}rM}}";split("){/_)/"\
"(_/[x+y*/=_/c+x/d+y/\\/while/return / | /--/++/Ey=0;y</()/Ex=0;x</|getline;/"\
"==/function /if(/for(/XC/aaa/BEGIN/\"",b, "/");for(i=1;i<26;i++)gsub(substr(\
"~'ZYWVUTSRQPONMLKIGFEDCA_",i,1),b[i],p);system(ARGV[0] " '" p "'");exit(0)}

aedeph
()
Ответ на: комментарий от aedeph

Ключевое слово - свой вариант :). Может он покажет миру что-то новое... )

YAR ★★★★★
()

И да, скрипт не универсален.

rain@acnote:/tmp$ echo REF100 | awk -F «[F][0-9]» ' {ORS=«»} { print «mv » $0 " " «\„„tolower($1) „f0“} {if (2>length($2)) print „0“} {ORS=“\n“} {print $2 »\«»}'
mv REF100 «ref000»

А вот что-нибудь такое - работает:

rain@acnote:/tmp$ echo REF001 | sed -r 's/([a-zA-Z]{3})([0-9]+)/mv \1\2 \«\L\1\2\»/g; s/([^0-9]+)([0-9]{2}\")$/\10\2/g'
mv REF001 «ref001»

rain@acnote:/tmp$ echo REF01 | sed -r 's/([a-zA-Z]{3})([0-9]+)/mv \1\2 \«\L\1\2\»/g; s/([^0-9]+)([0-9]{2}\")$/\10\2/g'
mv REF01 «ref001»

rain@acnote:/tmp$ echo REF100 | sed -r 's/([a-zA-Z]{3})([0-9]+)/mv \1\2 \«\L\1\2\»/g; s/([^0-9]+)([0-9]{2}\")$/\10\2/g'
mv REF100 «ref100»

YAR ★★★★★
()

Ъ-поцаны пишут всё на ассемблере sed-е, так что на пересдачу.

anonymous
()

садись, два. Правильный ответ:

ksu@ksu:~$ cat z
REF01
REF010
REF02
REF03
REF04
REF05
REF06
REF07
REF08
REF09
abcde17
ФфФфЫщ17
ksu@ksu:~$ sed -rn 'h;s/(.*[^0-9])([0-9]*)$/\L\1\n\2/;T;H;s/.*\n//;s/.*/000&/;s/.*(.{3})$/\1/;G;s/(.*)\n(.*)\n(.*)\n.*/mv \x27\2\x27 \x27\3\1\x27/;p' z
mv 'REF01' 'ref001'
mv 'REF010' 'ref010'
mv 'REF02' 'ref002'
mv 'REF03' 'ref003'
mv 'REF04' 'ref004'
mv 'REF05' 'ref005'
mv 'REF06' 'ref006'
mv 'REF07' 'ref007'
mv 'REF08' 'ref008'
mv 'REF09' 'ref009'
mv 'abcde17' 'abcde017'
mv 'ФфФфЫщ17' 'ффффыщ017'
drBatty ★★
()

Для твоего инпута

awk '{a=$1}; length(a) == 5 {sub("F", "F0", a)}; {print "mv \""$1"\" \""tolower(a)"\""}'

sdio ★★★★★
()
Ответ на: комментарий от adriano32

Ну гнутый пример вставил, а он в гнутой же обертке и не работает.

Andaril
() автор топика
Ответ на: комментарий от Andaril

sed не умеет считать. В данном случае я вывернулся вставив перед числом 000, а потом отрезав 3 посл. символа. Но в общем случае с цифрами sed НЕ работает (хотя один гуру и написал калькулятор на sed. Но это извращение конечно).

drBatty ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.