.png)
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
?
답변1
GNU awk
(일반적으로 Linux 시스템에서 발견됨)는 버전 4.1.0부터 명령줄에 "소스 라이브러리"를 포함할 수 있습니다( 참조 awk
:-i
--include
gawk의 -i 옵션이나 @include 지시문을 안전하게 사용하는 방법은 무엇입니까?이와 관련된 보안 문제에 대해서는 아래 Stéphane의 의견과 함께). 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
원본 파일이 아닌 임시 파일에서 실행) 원본 파일의 파일 메타데이터(권한 및 소유권)가 수정되지 않습니다.
답변2
이 시도.
awk new.awk sample.csv > tmp.csv && mv -f tmp.csv sample.csv
- 출력을 임시 파일로 리디렉션합니다.
- 그런 다음 임시 파일의 내용을 원본 파일로 옮깁니다.