awk를 사용하여 내부에서 파일을 변경하는 방법은 무엇입니까? ( "sed -i"와 같이)


11

나는이 awk스크립트를 new.awk:

 BEGIN { FS=OFS="," }
 NR==1 {
for (i=1; i<=NF; i++) {
    f[$i] = i
}
   } 
  NR > 1 {
 begSecs= mktime(gensub(/[":-]/," ","g",$(f["DateTime"])))
 endSecs = begSecs + $(f["TotalDuration"])
 $(f["CallEndTime"]) = strftime("%Y-%m-%d %H:%M:%S", endSecs)
 }
 { print }

나는 이것을 껍질로 부른다.

awk new.awk sample.csv

...하지만 터미널의 변경 사항을 볼 수 있습니다. ?를 사용할 때와 같이 파일에서 변경하는 방법은 sed -i무엇입니까?

답변:


16

awk버전 4.1.0부터 GNU (리눅스 시스템에서 일반적으로 사용) 는 명령 줄 awk과 함께 -i또는 --include명령 줄에 " 소스 라이브러리" 를 포함 할 수 있습니다 . GNU와 함께 배포되는 소스 라이브러리 awk중 하나는 inplace다음과 같습니다.

$ cat file
hello
there
$ awk -i inplace '/hello/ { print "oh,", $0 }' file
$ cat file
oh, hello

보시다시피 awk코드 출력이 입력 파일을 대체합니다. there프로그램에 의해 출력되지 않기 때문에 행 이 유지되지 않습니다.

으로 awk파일에 스크립트, 당신은 그것을 좋아 사용합니다

awk -i inplace -f script.awk datafile

awk변수 INPLACE_SUFFIX가 문자열로 설정된 경우 라이브러리는 파일 이름 접미사로 원본 파일을 백업합니다.

awk -i inplace -v INPLACE_SUFFIX=.bak -f script.awk datafile

입력 파일이 여러 개인 경우 각 파일을 개별적으로 편집 할 수 있습니다. 그러나 파일 inplace=0앞의 명령 줄 을 사용하여 파일 (또는 파일 세트)에 대한 전체 편집을 해제 할 수 있습니다 .

awk -i inplace -f script.awk file1 file2 inplace=0 file3 inplace=1 file4

위의 명령 file3에서 제자리에서 편집되지 않습니다.


단일 파일을보다 쉽게 ​​"제자리에서 편집"하려면

tmpfile=$(mktemp)
cp file "$tmpfile" &&
awk '...some program here...' "$tmpfile" >file
rm "$tmpfile"

입력 파일을 임시 위치에 복사 한 다음 awk원래 파일 이름으로 리디렉션하는 동안 임시 파일에 코드 를 적용합니다 .

awk원본 파일이 아닌 임시 파일에서 실행되는 순서대로 작업을 수행하면 원본 파일의 파일 메타 데이터 (권한 및 소유권)가 수정되지 않습니다.


4

이 시도.

awk  new.awk sample.csv > tmp.csv && mv -f tmp.csv sample.csv
  • 출력을 임시 파일로 리디렉션하십시오.
  • 그런 다음 임시 파일의 내용을 원본 파일로 이동하십시오.

1
awk 인플레 이스 소스 코드 를 보면 이것이 정확히하는 것입니다. 임시 파일을 생성하고 stdout을 리디렉션 한 다음 마지막에 입력 파일로 이름을 바꿉니다.
chx
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.