이 스레드의 주요 목표는 비 GNU에서 SAVE를 배치하는 방법 awk
이므로 모든 종류의 요구 사항에 도움이 될 템플릿을 먼저 게시하고 있으므로 코드에 추가 / 추가 BEGIN
및 END
섹션을 작성하여 기본 BLOCK을 유지해야합니다. 요구 사항과 그 자리에서 편집해야합니다.
참고 : 다음은 모든 출력을 output_file에 기록하므로 표준 출력으로 아무것도 인쇄하려면다음을print...
따르지 않고 명령문만 추가하십시오> (out)
.
일반 템플릿 :
awk -v out_file="out" '
FNR==1{
close(out)
out=out_file count++
rename=(rename?rename ORS:"") "mv \047" out "\047 \047" FILENAME "\047"
}
{
.....your main block code.....
}
END{
if(rename){
system(rename)
}
}
' *.txt
제공되는 특정 샘플 솔루션 :
나는 awk
그 자체 내에서 다음과 같은 접근법을 생각해 냈습니다 (추가 된 샘플은 이것을 해결하고 Input_file 자체에 출력을 저장하는 접근법입니다)
awk -v out_file="out" '
FNR==1{
close(out)
out=out_file count++
rename=(rename?rename ORS:"") "mv \047" out "\047 \047" FILENAME "\047"
}
{
print FNR > (out)
}
END{
if(rename){
system(rename)
}
}
' *.txt
참고 : 이것은 편집 된 출력을 Input_file 자체에 저장하기위한 테스트 일뿐입니다. 프로그램의 END 섹션과 함께 BEGIN 섹션을 사용할 수 있으며 주 섹션은 특정 질문 자체의 요구 사항에 따라야합니다.
공정한 경고 : 또한이 접근법은 경로에 새로운 임시 출력 파일을 생성하므로 시스템에 충분한 공간이 있는지 확인하십시오. 최종 결과에서는 기본 Input_file 만 유지되지만 작업 중에는 시스템 / 디렉토리에 공간이 필요합니다
다음은 위 코드에 대한 테스트입니다.
예를 들어 프로그램 실행 : 다음은.txt
Input_file이라고 가정합니다.
cat << EOF > test1.txt
onetwo three
tets testtest
EOF
cat << EOF > test2.txt
onetwo three
tets testtest
EOF
cat << EOF > test3.txt
onetwo three
tets testtest
EOF
이제 다음 코드를 실행할 때
awk -v out_file="out" '
FNR==1{
close(out)
out=out_file count++
rename=(rename?rename ORS:"") "mv \047" out "\047 \047" FILENAME "\047"
}
{
print "new_lines_here...." > (out)
}
END{
if(rename){
system("ls -lhtr;" rename)
}
}
' *.txt
참고 : 나는의도적으로 섹션ls -lhtr
에서system
어떤 출력 파일을 만들고 있는지 (임시 기준) 나중에 실제 이름으로 바꿀 것이기 때문에 배치했습니다.
-rw-r--r-- 1 runner runner 27 Dec 9 05:33 test2.txt
-rw-r--r-- 1 runner runner 27 Dec 9 05:33 test1.txt
-rw-r--r-- 1 runner runner 27 Dec 9 05:33 test3.txt
-rw-r--r-- 1 runner runner 38 Dec 9 05:33 out2
-rw-r--r-- 1 runner runner 38 Dec 9 05:33 out1
-rw-r--r-- 1 runner runner 38 Dec 9 05:33 out0
우리가 실행 ls -lhtr
후 after awk
script를 수행하면 .txt
거기에 파일 만 볼 수 있습니다.
-rw-r--r-- 1 runner runner 27 Dec 9 05:33 test2.txt
-rw-r--r-- 1 runner runner 27 Dec 9 05:33 test1.txt
-rw-r--r-- 1 runner runner 27 Dec 9 05:33 test3.txt
설명 : 여기에 위 명령에 대한 자세한 설명을 추가하십시오.
awk -v out_file="out" ' ##Starting awk program from here, creating a variable named out_file whose value SHOULD BE a name of files which are NOT present in our current directory. Basically by this name temporary files will be created which will be later renamed to actual files.
FNR==1{ ##Checking condition if this is very first line of current Input_file then do following.
close(out) ##Using close function of awk here, because we are putting output to temp files and then renaming them so making sure that we shouldn't get too many files opened error by CLOSING it.
out=out_file count++ ##Creating out variable here, whose value is value of variable out_file(defined in awk -v section) then variable count whose value will be keep increment with 1 whenever cursor comes here.
rename=(rename?rename ORS:"") "mv \047" out "\047 \047" FILENAME "\047" ##Creating a variable named rename, whose work is to execute commands(rename ones) once we are done with processing all the Input_file(s), this will be executed in END section.
} ##Closing BLOCK for FNR==1 condition here.
{ ##Starting main BLOCK from here.
print "new_lines_here...." > (out) ##Doing printing in this example to out file.
} ##Closing main BLOCK here.
END{ ##Starting END block for this specific program here.
if(rename){ ##Checking condition if rename variable is NOT NULL then do following.
system(rename) ##Using system command and placing renme variable inside which will actually execute mv commands to rename files from out01 etc to Input_file etc.
}
} ##Closing END block of this program here.
' *.txt ##Mentioning Input_file(s) with their extensions here.