이 프로그램은 예상대로 작동하지만 원하는 출력을 얻기 위해 서투른 방법을 사용하고 있는 것 같습니다(특히 인쇄 명령 및 변수 선언 사용).
누군가 이 스크립트를 개선하여 내가 개선할 수 있는 부분을 확인할 수 있습니까?
나에게 이것의 미친 우울한 버전을 보여주고 싶은 사람이 있습니까?
"각 줄을 실행합니다!@#!#@!"라는 BEGIN 블록에 변수가 설정됩니다. AWK에서 변수를 어떻게 설정해야 합니까?
#!/usr/bin/awk -f
BEGIN{
FS=",";
recordsCursor=1;
number=0;
#spacer="_";
#copies=3;
}
{
while(number++ <=copies){
while(recordsCursor <= NF){
if(recordsCursor==1){
printf($recordsCursor);
printf(spacer);
printf("%.3d,",number);
}else if(NF != recordsCursor){
printf("%s," , $recordsCursor);
}else{
printf("%s" , $recordsCursor);
}
recordsCursor++;
}
recordsCursor=1;
print "";
}
print "";
number=0;
}
Command: ./test.awk -v copies=3 -v spacer=_ input
주어진 입력:
madison_Leaderboard_728x90,728x90,Leaderboard ads for Madison,no,,,,,,,_blank,image,web
madison_Bullseye_300x250,300x250,Bullseye ads for Madison,no,,,,,,Bullseye,_blank,image,web
madison_Button_155x155,155x155,Button ads for Madison,no,,,,,,,_blank,image,web
올바른 출력:
madison_Leaderboard_728x90_001,728x90,Leaderboard ads for Madison,no,,,,,,,_blank,image,web
madison_Leaderboard_728x90_002,728x90,Leaderboard ads for Madison,no,,,,,,,_blank,image,web
madison_Leaderboard_728x90_003,728x90,Leaderboard ads for Madison,no,,,,,,,_blank,image,web
madison_Leaderboard_728x90_004,728x90,Leaderboard ads for Madison,no,,,,,,,_blank,image,web
madison_Bullseye_300x250_001,300x250,Bullseye ads for Madison,no,,,,,,Bullseye,_blank,image,web
madison_Bullseye_300x250_002,300x250,Bullseye ads for Madison,no,,,,,,Bullseye,_blank,image,web
madison_Bullseye_300x250_003,300x250,Bullseye ads for Madison,no,,,,,,Bullseye,_blank,image,web
madison_Bullseye_300x250_004,300x250,Bullseye ads for Madison,no,,,,,,Bullseye,_blank,image,web
madison_Button_155x155_001,155x155,Button ads for Madison,no,,,,,,,_blank,image,web
madison_Button_155x155_002,155x155,Button ads for Madison,no,,,,,,,_blank,image,web
madison_Button_155x155_003,155x155,Button ads for Madison,no,,,,,,,_blank,image,web
madison_Button_155x155_004,155x155,Button ads for Madison,no,,,,,,,_blank,image,web
답변1
awk -v copies=3 -v spacer=_ '
BEGIN {OFS=FS=","}
{
field1 = $1
for (i=1; i <= copies+1; i++) {
$1 = sprintf("%s%s%03d", field1, spacer, i)
print
}
print ""
}
'
이는 필드 값이 변경되면 $0를 재계산하는 awk의 장점을 활용합니다.