2016/01/30 14:52:51:
마지막 항목을 제외한 모든 항목을 제거하려고 합니다 . 나는 이것을 시도했습니다 :
awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'
마지막 항목을 제외한 모든 항목을 아무것도 없는 것으로 바꾸십시오. 그러나 이는 2016/01/30 14:52:51:
약간 다른 숫자로 4번만 반복됩니다.
답변1
이 스크립트에는 여러 가지 문제가 있으며 문제 설명에는 몇 가지 설명이 필요합니다.
- gsub 호출에 대한 잘못된 정규식 매개변수
- 업데이트는 (문에 사용된 값)에
$1
영향을 미치지 않습니다 .$0
print
- OP는 줄의 마지막 이벤트를 변경하지 않고 유지하려는 의도인지 아니면 날짜가 포함된 마지막 줄만 유지하려는 것인지(후자가 더 가능성이 높음) 명확하게 밝히지 않았습니다.
다음은 이러한 수정 사항과 가정이 포함된 스크립트입니다.
#!/bin/sh
awk '
BEGIN { row=0; fixup = -1; }
{
before[row] = $0;
gsub("2016/01/30 14:52:51: ", "", $0);
if ( $0 != before[row] ) {
fixup = row;
}
after[row++] = $0;
}
END {
if (fixup >= 0) {
after[fixup] = before[fixup];
}
for (n = 0; n < row; ++n) {
print after[n];
}
}
'
(두 개의 어레이를 사용하는 것은 덜 효율적이지만 before
어레이를 사용하지 않는 것보다 추가 수정이 더 쉽습니다).
입력 파일( )을 생성하여 foo.in
이를 테스트 했습니다.
1awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'
2awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'
3awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'
4awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'
다음과 같이 스크립트를 실행하십시오.
./foo <foo.in
그리고 얻었습니다
1awk '{gsub(//,"",$1);print}'
2awk '{gsub(//,"",$1);print}'
3awk '{gsub(//,"",$1);print}'
4awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'
답변2
내 기여는 Thomas Dickey의 AWK에 대한 POSIX 호환 대체물이며 동일한 가정을 합니다.
printf '%s\n' '1;?2016/01/30 14:52:51: ?' '1,.-g//s///' w q | ed filename
파일을 뒤로 탐색하는 ed의 기능은 이 작업을 매우 빠르게 만듭니다.