나는 배우고 awk있는데 파일에 수정 사항을 저장 sed하는 -i옵션을 사용하는 것과 유사하게 파일에 변경 사항을 쓰는 옵션이 있는지 알고 싶습니다 .
리디렉션을 사용하여 변경 사항을 작성할 수 있음을 이해합니다. 그러나 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
inplace실제로 iiSeymour의 답변gawk 에 따라 포함 된 라이브러리 이므로 로 포함 될 수있는 것입니다 . inplaceincludefile
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 .
공식 단어에 대한 매뉴얼 링크 입니다.
awk '{ gsub(/foo/, "bar" ) } ; { print $0 }' file > tmp.txt && mv -v tmp.txt file?
awk '{print $0}' file | sponge file사용 sponge에서 moreutils.
대안은 다음을 사용하는 것입니다 sponge.
awk '{print $0}' your_file | sponge your_file
당신은 대체 어디 '{print $0}'당신의 awk 스크립트에 의해 your_file파일의 이름으로 당신은 장소에서 편집 할.
sponge 파일에 저장하기 전에 입력을 완전히 흡수합니다.
sponge의 일부입니다 moreutils. 따라서 대부분의 시스템에는 기본적으로 존재하지 않습니다. 그러나 최소한 sponge그 자체는 충분히 휴대 가능하며 거의 모든 곳에서 실행할 수있는 것처럼 보입니다 .
tee기반 솔루션과 비교 하여이 솔루션의 단점은 sponge쓰기 전에 RAM으로 모든 것을 읽으므로 큰 파일에서 정지한다는 것입니다.
다음은 작동하지 않습니다
echo $(awk '{awk code}' file) > file
이 작동합니다
echo "$(awk '{awk code}' file)" > file
임시 파일을 만들지 않고 awk 전용 솔루션을 원하고 version! = (gawk 4.1.0)에서 사용할 수있는 경우 :
awk '{a[b++]=$0} END {for(c=0;c<=b;c++)print a[c]>ARGV[1]}' file