programing tip

awk로 수정 사항 저장

itbloger 2020. 7. 19. 10:43
반응형

awk로 수정 사항 저장


나는 배우고 awk있는데 파일에 수정 사항을 저장 sed하는 -i옵션을 사용하는 것과 유사하게 파일에 변경 사항을 쓰는 옵션이 있는지 알고 싶습니다 .

리디렉션을 사용하여 변경 사항을 작성할 수 있음을 이해합니다. 그러나 awk그렇게 할 수 있는 옵션 이 있습니까?


최신 GNU Awk ( 4.1.0 릴리스 이후 )에는 "inplace"파일 편집 옵션이 있습니다 .

[...] 새로운 기능을 사용하여 빌드 된 "inplace"확장을 사용하여 GNU " sed -i"기능 을 시뮬레이션 할 수 있습니다 . [...]

사용법 예 :

$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1 file2 file3

백업을 유지하려면

$ gawk -i inplace -v INPLACE_SUFFIX=.bak '{ gsub(/foo/, "bar") }
> { print }' file1 file2 file3

GNU awk 4.1.0 이상이 없다면 ...

sed의 -i옵션 과 같은 옵션이 없으므로 대신 다음을 수행하십시오.

$ awk '{print $0}' file > tmp && mv tmp file

참고 :는 -i마술이 아니며 임시 파일을 생성하여 sed처리합니다.


GNU awk 4.1.0부터 ...

GNU awk이 기능은 버전 4.1.0 (2013 년 10 월 5 일 릴리스) 에서 추가되었습니다 . -i릴리스 된 노트에 설명 된대로 옵션을 제공하는 것만 큼 간단하지 않습니다 .

xgawk의 새로운 -i 옵션은 awk 라이브러리 파일을로드하는 데 사용됩니다. 옵션이 아닌 첫 번째 인수가 스크립트로 취급된다는 점에서 -f와 다릅니다.

inplace.awk다음과 같이 번들 포함 파일 을 사용 하여 확장을 올바르게 호출해야합니다.

$ cat file
123 abc
456 def
789 hij

$ gawk -i inplace '{print $1}' file

$ cat file
123
456
789

변수 INPLACE_SUFFIX는 백업 파일의 확장자를 지정하는 데 사용할 수 있습니다.

$ gawk -i inplace -v INPLACE_SUFFIX=.bak '{print $1}' file

$ cat file
123
456
789

$ cat file.bak
123 abc
456 def
789 hij

나는이 기능이 추가되었습니다 행복하지만 전원이 언어의 간결함에서 오는와 같이 나에게, 구현은 매우 awkish하지 않습니다 -i inplace너무 오래 8 자입니다 IMO .

공식 단어에 대한 매뉴얼 링크 입니다.


@sudo_O정답 입니다.

작동하지 않습니다.

someprocess < file > file

셸은 제어를 일부 프로세스로 넘기기 전에 리디렉션을 수행합니다 ( redirections ). >재 크기가 0 (에 파일을 자릅니다 리디렉션 출력 ). 따라서 일부 프로세스가 시작되어 파일에서 읽으려고 할 때까지 읽을 데이터가 없습니다.


작동하는 약간의 해킹

echo "$(awk '{awk code}' file)" > file

대안은 다음을 사용하는 것입니다 sponge.

awk '{print $0}' your_file | sponge your_file

Where you replace '{print $0}' by your awk script and your_file by the name of the file you want to edit in place.

sponge absorbs entirely the input before saving it to the file.


following won't work

echo $(awk '{awk code}' file) > file

this should work

echo "$(awk '{awk code}' file)" > file

Using tee

 awk '{awk code}' file | tee file

the tee command take place and executed after the awk command is finished due to the |.


In case you want an awk-only solution without creating a temporary file and usable with version!=(gawk 4.1.0):

awk '{a[b++]=$0} END {for(c=0;c<=b;c++)print a[c]>ARGV[1]}' file

참고URL : https://stackoverflow.com/questions/16529716/save-modifications-in-place-with-awk

반응형